在回答了这个问题后,我发现我必须使用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
但即使尝试绑定到Equals
,GetHashCode
或ToString
等成员也会导致错误
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"));
将失败,并出现“绑定到目标方法时出错”。
答案 0 :(得分:0)
如何让编译器担心它,即
public static string SomeHelper(A obj) {
return obj.SomeMethod();
}
然后绑定到“SomeHelper”。这也可能是所需的通用方法,它将使用神奇的“约束”操作码。
这也类似于
Func<A string> func = obj => obj.SomeMethod();
如果您正在使用该方法进行反思,可以尝试使用DynamicMethod。