【发布时间】:2011-05-18 14:59:21
【问题描述】:
我有一个我想调用的带有私有方法的结构。由于我计划在性能关键部分执行此操作,因此我想缓存一个委托来执行该操作。问题是我似乎无法使用 Delegate.CreateDelegate 绑定到它的方法。有问题的结构不是我的创作,而是用于与第三方库的交互。 有问题的结构如下所示::
public struct A
{
private int SomeMethod()
{
//body go here
}
}
以下代码将失败并显示“错误绑定到目标方法”。
Delegate.CreateDelegate(typeof(Func<A,int>),typeof(A).GetMethod("SomeMethod",BindingFlags.Instance | BindingFlags.NonPublic));
我知道我可以编写一个表达式树来执行该操作,但我不能使用我的正常 goto 来处理这些事情 Delegate.CreateDelegate 方法似乎很奇怪。
如果A 是一个类,上面的代码就可以正常工作。之所以会出现这个问题,是因为 A 是一个结构。
MSDN 文档对于 CreateDelegate 的这种重载是不正确的,因为它确实适用于非静态方法。
【问题讨论】:
-
出于好奇,为什么要使用结构实例方法?使用结构实例方法创建委托实际上需要对结构进行装箱才能使用它,因此装箱的结构实例将有效地表现为类类型。为什么不只使用一个类开始(即使该类只包含一个结构类型的字段)?
-
这是一个老问题,但结构来自第三方库。但是,使用委托不会装箱或复制它,因为结构实例方法是“按引用”的。我需要在他们给我的句柄上调用一个方法。因为他们最后才叫它,但我想早点做(我不记得了)。
-
我猜如果您打算将 struct 方法视为采用
ref参数的静态方法(而不是从未绑定委托创建绑定委托),您可以避免拳击,虽然在那种情况下我认为使用静态结构方法会更清楚。 -
再说一次,不是我的代码。我需要调用第三方的私有实现细节,因为他们有点过于保守了。它们的句柄充当一系列对象的代理。