C#:创建委托列表的语法是否不那么难看?

C#:创建委托列表的语法是否不那么难看?,c#,delegates,types,inference,C#,Delegates,Types,Inference,我正在构建一个有点像LINQ的系统,在这样做的过程中,我试图支持多态回调处理程序列表,并且遇到了几种问题。问我的问题的简单方法是向您展示一些代码。我的新系统支持“组”,组有一个入口点向量(下面是UPDATE和CHECKPT),向量上的每个元素都是代理的多态列表,我将使用反射调用它 因此,示例代码: namespace ConsoleApplication1 { internal delegate void GroupISDHandler(int i, string s, double

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

因此,示例代码:

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()将是一种匿名类型,而C#将生成类似

private delegate void _atype1(int _a0, string _a1, double _a2)
然后在编译行之前插入
(委托)(\u atype1)
。因此,我的用户不需要声明委托类型(这实际上迫使她键入两次参数列表)


从VS2010开始,我就有了
System.Linq
。因此,如果LINQ能够以某种方式推断出所需的强制转换…

您应该能够这样做:

g.handlers[UPDATE]+=(GroupISDHandler)((x,s,d)=>
控制台写入线(
调用了我的int,string,double处理程序,其中x={0},s={1},d={2},
x、 (s,d),

另一种选择是:

有一个名为“Parameters”的类,它是用户可以发送的任何内容的容器,如果它们从未更改,则可能是定义的类型,如果您假装发送和接收不同数量的参数,则可能是对象列表。然后,代替委托,您将采取与接受一个参数的委托相同的操作,并且您可以在不强制转换的情况下执行调用,如下所示:


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

结果表明,答案基本上是这样的:虽然你可以在我想到的那种情况下进行推理,但C#所有者希望得到完全通用的解决方案,在他们看来,多态性使得类型推理问题很难以足够通用的方式解决。我自己也不同意,因为我最后把所有的类型签名都打了两次,但这就是他们的理由。

我刚刚注意到,您也想要取消强制转换,为什么需要参数?或者它们总是3?参数会变化;一条传入消息可能包含int和字符串;第二个可能有一个foobar数组,等等。我的交付逻辑为每个匹配执行一个向上调用。(添加一点说明:触发upcall的传入消息包含至少需要与其中一个回调匹配的数据。当您向组发送多播时,我会检查以确保它与某些upcall的某些合法类型签名匹配。因此:参数来自消息,其类型将匹配,等等)。这是一个有趣的想法。因此,在这个版本中,我的用户确实需要强制转换,但可以避免指定参数类型,并且不需要说“委托”。我喜欢这样。稍微不那么混乱。不过,遗憾的是,声明离代码太远了:看这个的人不知道x、s和d的类型。
private delegate void _atype1(int _a0, string _a1, double _a2)