如何为类型为对象的属性设置器创建委托

问题描述 投票:0回答:1

[我正在寻找一种为属性的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,即intdoublestringobject等?

我找到了有趣的答案,例如以下内容,但找不到实现我想要的方法。Creating a property setter delegate

非常感谢。

c# object lambda reflection delegates
1个回答
0
投票

感谢Iliar Turdushev指出线程here的评论,也感谢这篇博客文章here,我能够提出以下内容。

© www.soinside.com 2019 - 2024. All rights reserved.