封装动作T和Func?
我正在尝试为某种 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();
I'm trying to make a design for some sort of IExecutable interface. I will not get into details, but the point is that I have several Actions that need to be executed from a base class. They may take different parameters (no big deal), and they may/may not return a value.
So far, this is my design:
public abstract class ActionBase
{
// ... snip ...
}
public abstract class ActionWithResultBase<T>: ActionBase
{
public abstract T Execute();
}
public abstract class ActionWithoutResultBase: ActionBase
{
public abstract void Execute();
}
So far, each of my concrete actions need to be a child from either ActionWithResultBase or ActionWithoutResult base, but I really don't like that. If I could move the definition of Execute to ActionBase, considering that the concrete class may or may not return a value, I will have achieved my goal.
Someone told me this could be done with using Func and Action, for which I totally agree, but I can't find a way to have that into one single class so that the caller would know if the action is going to return a value or not.
Brief: I want to do something like:
// Action1.Execute() returns something.
var a = new Action1();
var result = a.Execute();
// Action2.Execute() returns nothing.
var b = new Action2();
b.Execute();
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
如果您想要一个轻量级的解决方案,那么最简单的选择是编写两个具体的类。一个将包含
Action
类型的属性,另一个包含Func
类型的属性:然后您可以像这样构造这两种类型:
如果您不想要使
Action
属性读/写,那么您可以将操作委托作为参数传递给构造函数并使该属性只读。C# 需要两个不同的委托来表示函数和操作,这一事实非常烦人。人们使用的一种解决方法是定义一个表示“无返回值”的类型
Unit
并使用它来代替void
。那么您的类型将只是Func
并且您可以使用Func
而不是Action
。Unit
类型可能如下所示:要创建
Func
值,您将编写:If you want a lightweight solution, then the easiest option would be to write two concrete classes. One will contain a property of type
Action
and the other a property of typeFunc<T>
:Then you can construct the two types like this:
If you don't want to make
Action
property read/write, then you could pass the action delegate as an argument to the constructor and make the property readonly.The fact that C# needs two different delegates to represent functions and actions is quite annoying. One workaround that people use is to define a type
Unit
that represents "no return value" and use it instead ofvoid
. Then your type would be justFunc<T>
and you could useFunc<Unit>
instead ofAction
. TheUnit
type could look like this:To create a
Func<Unit>
value, you'll write:以下接口应该可以解决问题——它本质上是复制 Nullable 模式
The following interfaces should do the trick -- it's essentially copying the Nullable pattern
您知道可以忽略方法的返回值吗?您不必使用它。
You know that you can ignore the return value of a method right? You don't have to use it.
一些简单的事情怎么样:
what about something simple: