【问题标题】:Create delegate of array get method fails创建数组 get 方法的委托失败
【发布时间】:2014-01-31 12:01:25
【问题描述】:

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

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

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

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

虽然 Get 方法默认是不可见的,但第一行确实有效并找到了正确的方法。由于签名匹配,我认为异常与 Get 方法是安全透明的这一事实有关,而 Func 可能不是。如何判断一个委托类型是否安全透明以及如何解决这个问题?

【问题讨论】:

  • 这段代码在哪里执行?虚拟主机?还是什么?
  • 您好,很抱歉信息不足。我在一个客户端控制台应用程序中执行了这段代码,该应用程序应该完全信任并且仍然得到这个异常。

标签: c# delegates code-access-security


【解决方案1】:

我认为您发现了一个 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 上发布反馈以听取专家的意见,但不要指望快速修复错误。

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 还有一个 CreateDelegate 的重载,它直接采用 MethodInfo 对象(实例,而不是类)。然而,令人惊讶的是(至少对我而言),这是可行的。奇怪的是 MethodInfo 的重载不起作用。我仍然想知道为什么。
    【解决方案3】:

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

    以下工作正常:

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

    【讨论】:

      【解决方案4】:

      请检查以下链接。它讨论了 Argument 异常的可能原因

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-10
        • 2012-04-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多