创建数组get方法的委托失败

时间:2014-01-31 12:01:26

标签: c# delegates code-access-security

尝试创建一个访问数组的委托,我得到一个ArgumentException,说该方法无法绑定。

  

无法绑定到目标方法,因为其签名或安全透明度与委托类型的方法不兼容。

重现此代码的最小代码量如下:

var method = typeof(string[,]).GetMethod("Get");
var func = Delegate.CreateDelegate(typeof(Func<int, int, string>), new string[4,5], method);

虽然默认情况下Get方法是不可见的,但第一行确实有效并找到了正确的方法。当签名匹配时,我认为该异常与Get方法是安全透明的事实有关,而Func&lt ;,&gt;可能不是。如何确定委托类型是否安全透明以及如何解决此问题?

4 个答案:

答案 0 :(得分:6)

我认为你发现了一个CLR错误。有两个根本不同的代码块绑定委托,BindToMethodInfo和BindToMethodName。由于它们内部发生的缓存,它们很难解开,我猜测那里有一些错误,并且与在.NET中特别处理数组这一事实有关。

以前没有注意到这一点在某种程度上是可以解释的,当然每个试图做你所做的事情的人都使用记录在案的Array.GetValue()方法。像这样:

   var method = typeof(string[,]).GetMethod("GetValue", 
                                     new Type[] { typeof(int), typeof(int) });
   var func = Delegate.CreateDelegate(typeof(Func<int, int, object>), 
                                     new string[4, 5], method);

哪个工作正常。您可以在connect.microsoft.net上发布反馈,以听取专家的意见,但不要指望快速修复错误。

答案 1 :(得分:4)

嗯,我想你需要看一下CreateDelegate方法的签名。

var func = Delegate.CreateDelegate(typeof(Func<int, int, string>), new string[4, 5], method.Name);

看看我添加了method.Name的位置?您正尝试发送MethodInfo类。

答案 2 :(得分:2)

Get方法的实际签名具有object返回类型。

以下工作:

var method = typeof(string[,]).GetMethod("Get");
var func = Delegate.CreateDelegate(typeof(Func<int, int, object>), new string[4,5], method);

答案 3 :(得分:0)

请查看以下链接。它讨论了参数异常的可能原因

http://msdn.microsoft.com/en-us/library/53cz7sc6(v=vs.110).aspx