Это не сработает, потому что у вас, например, будет Func<Button, string>
в вашем списке, но вы можете в итоге назвать его, скажем, Label
. Какова функция, которая ожидает Button
, ожидается, что делать с Label
?
Вы могли бы сделать что-то вроде этого:
public class ValueGetter<T> where T : Control
{
public List<Func<T, string>> Operations { get; set; }
public ValueGetter()
{
this.Operations = new List<Func<T, string>>();
}
public void Map(Func<T, string> valueGetter)
{
this.Operations.Add(valueGetter);
}
}
Другими словами, иметь отдельные ValueGetter
s для каждого типа элемента управления.
Редактировать: Другая идея: Вы можете добавить функцию, которая просто разрешает операцию, только если тип является правильным, например:
public void Map<T>(Func<T, string> valueGetter) where T : Control
{
this.Operations.Add(control => (control is T) ? valueGetter((T) control) : null);
}
В этом случае, если ожидающей функции Button
будет дан Label
, она просто вернет ноль.