[我正在寻找一种为属性的setter创建委托的方法,而又不知道属性的类型,例如,我想要Action<TClass, TType>
而不是Action<TClass, object>
。将要调用Action<TClass, object>
的代码将始终具有正确的基础类型,即object
。目的是稍后再缓存这些委托。
请考虑以下示例。
public class MyClass<T>
{
public T MyProperty { get; set; }
}
我可以如下设置MyProperty
。
var myClass = new MyClass<int>();
var property = typeof(MyClass<int>).GetProperty("MyProperty");
object intAsObject = 2;
//Option 1. This works, but is slow
property.SetValue(myClass, intAsObject);
//Option 2. This works, but I need to know the type of MyProperty at compile time.
var setter = (Action<MyClass<int>, int>)property.SetMethod.CreateDelegate(typeof(Action<MyClass<int>, int>));
setter(myClass, 5);
//Option 3. This does not work. It throws ArgumentException. Is it possible to achieve something like this?!
var objSetter = (Action<MyClass<int>, object>)property.SetMethod.CreateDelegate(typeof(Action<MyClass<int>, object>));
objSetter(myClass, intAsObject);
如何实现选择#3?附带ArgumentException
的消息如下:无法绑定到目标方法,因为其签名或安全性与委托类型的签名或安全性不兼容。
此外,是否可以使它适用于任何T
,即int
,double
,string
,object
等?
我找到了有趣的答案,例如以下内容,但找不到实现我想要的方法。Creating a property setter delegate
非常感谢。