2014-01-31 24 views
3

试图创建一个委托来访问数组,我得到一个ArgumentException,说该方法不能被绑定。创建数组获取方法失败

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

的代码来重现此最低金额如下:

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

虽然Get方法是在默认情况下不可见,在第一行不实际工作,并找到正确的方法。当签名匹配时,我认为这个异常与Get方法是安全透明的事实有关,而Func < ,,>可能不是。如何确定委托类型是否安全透明以及如何解决此问题?

+1

这是哪里的代码执行?虚拟主机?或者是什么? –

+0

嗨,对于这种缺乏信息感到抱歉。我在客户端控制台应用程序中执行此代码,该应用程序应具有完全信任并仍然会出现此异常 – Georg

回答

6

我想你找到了一个CLR的bug。有两个根本不同的代码块,它们绑定了一个委托,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上发布反馈以听取专家的意见,但不要指望快速的错误修复。

4

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

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

看看我在哪里添加了method.Name?您正试图发送一个MethodInfo类。

+3

还有一个CreateDelegate重载,直接接受MethodInfo对象(实例,而不是类)。然而,令人惊讶的是(至少对我而言),这是有效的。很奇怪,MethodInfo的重载不起作用。我仍然想知道为什么。 – Georg

2

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

以下工作:

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