我正在尝试为某种 IExecutable 接口进行设计。我不会详细介绍,但重点是我有几个需要从基类执行的操作。它们可能采用不同的参数(没什么大不了的),并且它们可能/可能不返回值。
到目前为止,这是我的设计:
public abstract class ActionBase
{
// ... snip ...
}
public abstract class ActionWithResultBase<T>: ActionBase
{
public abstract T Execute();
}
public abstract class ActionWithoutResultBase: ActionBase
{
public abstract void Execute();
}
到目前为止,我的每个具体操作都需要是 ActionWithResultBase 或 ActionWithoutResult 基的子级,但我真的不喜欢这样。如果我可以将 Execute 的定义移至 ActionBase,考虑到具体类可能会也可能不会返回值,那么我将实现我的目标。
有人告诉我这可以通过使用 Func 和 Action 来完成,我完全同意,但我找不到一种方法将其放入一个类中,以便调用者知道该操作是否会返回一个值或不是。
简介:我想做一些类似的事情:
// Action1.Execute() returns something.
var a = new Action1();
var result = a.Execute();
// Action2.Execute() returns nothing.
var b = new Action2();
b.Execute();
如果您想要一个轻量级的解决方案,那么最简单的选择是编写两个具体的类。其中一个将包含 type 的属性Action
另一个是 type 的属性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
. The Unit
类型可能如下所示:
public class Unit {
public static Unit Value { get { return null; } }
}
创建一个Func<Unit>
值,你会写:
Func<Unit> f = () => { /* ... */ return Unit.Value; }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)