Delegate.CreateDelegate无法绑定到struct member覆盖的错误是什么?

时间:2010-12-01 17:27:20

标签: c# delegates

在回答了这个问题后,我发现我必须使用ref参数来调用结构上的实例方法。 How can I create an open Delegate from a struct's instance method?

我似乎无法绑定到显式接口实现之类的方法覆盖(以避免相关的拳击惩罚,(就IL而言,这实际上是覆盖的)), 这是一个错误报告,在未来的.NET版本中,我们可以绑定到结构上的接口成员: https://connect.microsoft.com/VisualStudio/feedback/details/574959/cannot-create-open-instance-delegate-for-value-types-methods-which-implement-an-interface?wa=wsignin1.0#details

但即使尝试绑定到EqualsGetHashCodeToString等成员也会导致错误 e.g。

public struct A
{
     public override int GetHashCode(){/*implementation goes here*/}
}
delegate TRet FuncByRef<TStruct,TRet>(ref TStruct) where TStruct:struct

...

Delegate.CreateDelegate(typeof(FuncByRef<A,int>),typeof(A).GetMethod("GetHashCode"));

将失败,并出现“绑定到目标方法时出错”。

1 个答案:

答案 0 :(得分:0)

如何让编译器担心它,即

public static string SomeHelper(A obj) {
    return obj.SomeMethod();
}

然后绑定到“SomeHelper”。这也可能是所需的通用方法,它将使用神奇的“约束”操作码。

这也类似于

Func<A string> func = obj => obj.SomeMethod();

如果您正在使用该方法进行反思,可以尝试使用DynamicMethod。