C# 当多个方法仅在1个枚举参数中不同时,CreateDelegate()会创建错误的委托

C# 当多个方法仅在1个枚举参数中不同时,CreateDelegate()会创建错误的委托,c#,delegates,C#,Delegates,我在为类的某些方法创建正确的委托时遇到了一些问题。有一个基类和一个派生类,它们都有一个方法protectedobjectgetvalue(EnumPID),但是EnumPID在这两个类中分别定义。因此,一般来说,这两种功能可以相互区分。 现在我尝试使用 Delegate.CreateDelegate(类型、对象、字符串), 因为new(function)不起作用,因为功能不公开。 失败的原因是由Delegate.CreateDelegate()创建的两个委托都指向同一个函数,即派生类中的函数 为

我在为类的某些方法创建正确的委托时遇到了一些问题。有一个基类和一个派生类,它们都有一个方法
protectedobjectgetvalue(EnumPID)
,但是
EnumPID
在这两个类中分别定义。因此,一般来说,这两种功能可以相互区分。
现在我尝试使用
Delegate.CreateDelegate(类型、对象、字符串)

因为
new(function)
不起作用,因为
功能不公开。
失败的原因是由
Delegate.CreateDelegate()
创建的两个委托都指向同一个函数,即派生类中的函数

为了简化它,这里有一个测试类。我发现,没有必要使用继承,它也可以用同一类中的两个不同枚举进行复制:

public class CClass
{
  public delegate void DelegatePrint1 (Enum1 i_en1);
  public delegate void DelegatePrint2 (Enum2 i_en2);
  public delegate void DelegatePrint3 (Enum3 i_en3);

  public enum Enum1 { a = 1, b = 2 }
  public enum Enum2 { a = 99 }
  public enum Enum3 { z = 100 }

  public void Print (Enum1 i_en1) { Console.WriteLine (i_en1.ToString () + "=" + (int)i_en1); }
  public void Print (Enum2 i_en2) { Console.WriteLine (i_en2.ToString () + "=" + (int)i_en2); }
  public void Print (Enum3 i_en3) { Console.WriteLine (i_en3.ToString () + "=" + (int)i_en3); }
}

private static void Main ()
{
  string sMethod_Print = "Print";
  var oClass = new CClass ();
  var delPrint1 = (CClass.DelegatePrint1)Delegate.CreateDelegate (typeof (CClass.DelegatePrint1), oClass, sMethod_Print);
  var delPrint2 = (CClass.DelegatePrint2)Delegate.CreateDelegate (typeof (CClass.DelegatePrint2), oClass, sMethod_Print);
  var delPrint3 = (CClass.DelegatePrint3)Delegate.CreateDelegate (typeof (CClass.DelegatePrint3), oClass, sMethod_Print);
  delPrint1 (CClass.Enum1.a);
  delPrint1 (CClass.Enum1.b);
  delPrint2 (CClass.Enum2.a);
  delPrint3 (CClass.Enum3.z);
}
预期产量为

a=1
b=2
a=99
z=100
1=1
2=2
99=99
z=100
实际输出为

a=1
b=2
a=99
z=100
1=1
2=2
99=99
z=100
因为所有学员都调用
打印(Enum3)

我的问题:
1) 如何创建正确的代理?(我已经发现了,请参见下面我自己的答案)。

2) 为什么
CreateDelegate(类型、对象、字符串)
创建了错误函数的委托?给定的类型是否不足以确定正确的类型?

显然,委托的构造函数比
委托.CreateDelegate()函数聪明得多,因为
var del1=new CClass.DelegatePrint1(oClass.Print)
创建正确的委托,但这仅在函数为公共函数时有效

解决方案是:而不是
Delegate.CreateDelegate(类型、对象、字符串)

您必须使用
Delegate.CreateDelegate(类型、对象、方法信息)

方法信息为
var-oMethod1=typeof(CClass.GetMethod)(“Print”,新类型[]{typeof(CClass.Enum1)})
这样就选择了正确的
Print
过载

至于为什么这是必要的(这是我的第二个问题),我没有答案。我在上签出了
CreateDelegate()
的.net源代码,但我不太清楚它是如何工作的,因为它调用外部方法
MulticastDelegate InternalAlloc(RuntimeType类型)
bool bindtomethName(对象目标、RuntimeType方法类型、字符串方法、DelegateBindingFlags标志)
。我猜要么类型信息没有被
InternalAlloc
完全保留,要么
BindToMethodName
Enum
作为
int