【发布时间】:2010-12-11 15:31:57
【问题描述】:
我正在构建一个有点像 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# 不能推断类型以便我可以完全省略强制转换和新的委托类型?我想从
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)。因此,我的用户不需要声明委托类型(这实际上强制她键入参数列表两次)。
我确实有 System.Linq,因为我在 VS 2010 上。所以如果 LINQ 能以某种方式推断出所需的演员...
【问题讨论】:
-
我刚刚注意到您也想摆脱 Cast,为什么需要参数?还是他们总是 3?
-
参数会有所不同;一个传入的消息可能有一个 int 和一个字符串;第二个可能有一个 FooBars 数组,等等。我的交付逻辑对每个匹配项进行一次调用。
-
(添加一点解释:触发上行调用的传入消息包含需要匹配至少一个这些回调的数据。当您向组发送多播时,我检查使确保它与某些向上调用的合法类型签名匹配。所以:参数来自消息,它们的类型将匹配,等等)。
标签: c# delegates types inference