我试图在Delegate.CreateDelegate
方法上使用ToString()
。
它在引用类型上完全正常,但在值类型上失败。
这是我的测试代码:
using System;
class ReferenceType { }
struct ValueType { }
class Program
{
static void Main(string[] args)
{
var referenceMethod = typeof(ReferenceType).GetMethod("ToString", Type.EmptyTypes);
var referenceDelegate = (Func<ReferenceType, string>)Delegate.CreateDelegate(typeof(Func<ReferenceType, string>), referenceMethod);
var valueMethod = typeof(ValueType).GetMethod("ToString", Type.EmptyTypes);
var valueDelegate = (Func<ValueType, string>)Delegate.CreateDelegate(typeof(Func<ValueType, string>), valueMethod);
Console.WriteLine(referenceDelegate.Invoke(new ReferenceType()));
Console.WriteLine(valueDelegate.Invoke(new ValueType()));
}
}
每当我尝试创建valueDelegate
时,我都会遇到以下异常:
System.ArgumentException:&#39;无法绑定到目标方法,因为其签名或安全透明度与委托类型的方法不兼容。&#39;
然而,ValueType.ToString()
存在并匹配Func<ValueType, String>
的签名。
用任何原始类型(例如ValueType
)替换int
都会做同样的事情。
这个限制有什么理由吗?
如何创建委托?
编辑:在完成测试之后,似乎任何方法(不只是ToString
)都会在值类型上失败,例如:
using System;
class ReferenceType
{
public string Test() { return "Test"; }
}
struct ValueType
{
public string Test() { return "Test"; }
}
class Program
{
static void Main(string[] args)
{
var referenceMethod = typeof(ReferenceType).GetMethod("Test", Type.EmptyTypes);
var referenceDelegate = (Func<ReferenceType, string>)Delegate.CreateDelegate(typeof(Func<ReferenceType, string>), referenceMethod);
var valueMethod = typeof(ValueType).GetMethod("Test", Type.EmptyTypes);
var valueDelegate = (Func<ValueType, string>)Delegate.CreateDelegate(typeof(Func<ValueType, string>), valueMethod);
Console.WriteLine(referenceDelegate.Invoke(new ReferenceType()));
Console.WriteLine(valueDelegate.Invoke(new ValueType()));
}
}