Если вы хотите облегченное решение, то самым простым вариантом будет написать два конкретных класса.Один будет содержать свойство типа Action
, а другой - тип Func<T>
:
public class ActionWithResult<T> : ActionBase {
public Func<T> Action { get; set; }
}
public class ActionWithoutResult : ActionBase {
public Action Action { get; set; }
}
. Затем вы можете создать два типа следующим образом:
var a1 = new ActionWithResult<int> {
CanExecute = true,
Action = () => {
Console.WriteLine("hello!");
return 10;
}
}
Есливы не хотите делать свойство Action
доступным для чтения / записи, тогда вы можете передать делегат действия в качестве аргумента конструктору и сделать свойство доступным только для чтения.
Тот факт, что C # требует двух разных делегатов для представленияФункции и действия довольно раздражают.Один из обходных путей, который используют люди, - это определить тип Unit
, который представляет «нет возвращаемого значения», и использовать его вместо void
.Тогда ваш тип будет просто Func<T>
, и вы сможете использовать Func<Unit>
вместо Action
.Тип Unit
может выглядеть следующим образом:
public class Unit {
public static Unit Value { get { return null; } }
}
Чтобы создать значение Func<Unit>
, вы напишите:
Func<Unit> f = () => { /* ... */ return Unit.Value; }