gpt4 book ai didi

c# - 封装 Action 和 Func

转载 作者:可可西里 更新时间:2023-11-01 08:44:37 25 4
gpt4 key购买 nike

我正在尝试为某种 IExecutable 接口(interface)进行设计。我不会详细介绍,但重点是我有几个需要从基类执行的操作。它们可能采用不同的参数(没什么大不了的),并且它们可能会/可能不会返回值。

到目前为止,这是我的设计:

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();

最佳答案

如果您想要一个轻量级的解决方案,那么最简单的选择就是编写两个具体的类。一个将包含 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属性读/写,然后您可以将操作委托(delegate)作为参数传递给构造函数,并使该属性只读。

C# 需要两个不同的委托(delegate)来表示函数和操作这一事实非常烦人。人们使用的一种解决方法是定义一个类型 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; }

关于c# - 封装 Action<T> 和 Func<T>?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4279210/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com