gpt4 book ai didi

C#:用于创建委托(delegate)列表的不那么难看的语法?

转载 作者:行者123 更新时间:2023-11-30 12:35:55 24 4
gpt4 key购买 nike

我正在构建一个有点像 LINQ 的系统,在这样做的过程中,我试图支持多态回调处理程序列表,但遇到了几种问题。问我问题的简短方法是只向您展示一些代码。我的新系统支持“组”,组有一个入口点向量(下面是 UPDATE 和 CHECKPT),向量上的每个元素都是委托(delegate)的多态列表,我将使用反射调用它。

因此,示例代码:

namespace ConsoleApplication1
{

internal delegate void GroupISDHandler(int i, string s, double d);
class Group
{
public class myHandlers {
internal List<Delegate> hList = new List<Delegate>();
public static myHandlers operator +(myHandlers a, Delegate b) {
a.hList.Add(b);
return a;
}
}

public class mimicVector {
public List<myHandlers> ListofhLists = new List<myHandlers>();
public myHandlers this[int i] { get { return ListofhLists[i]; } set { ListofhLists[i] = value; } }
}

public mimicVector handlers = new mimicVector();

public Group(string name) { ... }
}

class Program
{
internal const int UPDATE = 0;
internal const int CHECKPT = 1;

public static void Main()
{
Group g = new Group("group name");
g.handlers[UPDATE] += (GroupISDHandler)delegate(int x, string s, double d) {
Console.WriteLine("my int,string,double handler was called, with x = {0}, s = {1}, d = {2}",
x,s,d);
};
}
}
}

我的问题集中在注册线上。为什么 C# 不能推断类型以便我可以完全省略强制转换和新的委托(delegate)类型?我会认为从

 g.handlers[UPDATE] += delegate(int x, string s, double d) {
Console.WriteLine(....);
};

C# 可以推断出所需的类型签名。 delegate() 将是一种匿名类型,而 C# 只会生成类似

的内容
private delegate void _atype1(int _a0, string _a1, double _a2)

然后在编译该行之前插入 (Delegate)(_atype1)。因此,我的用户不需要声明委托(delegate)类型(这实际上强制她输入参数列表两次)。

我确实有 System.Linq,因为我使用的是 VS 2010。因此,如果 LINQ 可以以某种方式推断出所需的转换...

最佳答案

你应该可以这样做:

g.handlers[UPDATE] += (GroupISDHandler)((x, s, d) =>
控制台.WriteLine(
“我的 int、string、double 处理程序被调用,x = {0},s = {1},d = {2}”,
x, s, d));

另一种选择是:

有一个名为“Parameters”的类,它是用户可以发送的任何内容的容器,如果它们从不更改,则可能是已定义的类型,或者如果您假装发送和接收不同数量的参数,则可能是一个对象列表。然后,您将采取等于接受一个参数的委托(delegate)的 Action 而不是委托(delegate),并且您可以在不强制转换的情况下进行调用,如下所示:

p => Console.WriteLine("x = {0}, s = {1}, d = {2}", p.x, p.s, p.d);

关于C#:用于创建委托(delegate)列表的不那么难看的语法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4417417/

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