gpt4 book ai didi

C# 通过 Delegate.CreateDelegate 使用具有值类型的属性

转载 作者:行者123 更新时间:2023-11-30 15:32:21 31 4
gpt4 key购买 nike

使用 Jon Skeet 的文章 Making reflection fly and exploring delegates作为指南,我正在尝试使用 Delegate.CreateDelegate 方法将属性复制为委托(delegate)。这是一个示例类:

public class PropertyGetter
{
public int Prop1 {get;set;}
public string Prop2 {get;set;}

public object GetPropValue(string propertyName)
{
var property = GetType().GetProperty(propertyName).GetGetMethod();
propertyDelegate = (Func<object>)Delegate.CreateDelegate(typeof(Func<object>), this, property);

return propertyDelegate();
}
}

我遇到的问题是,当我调用 GetPropValue 并传入 "Prop1" 作为参数时,我得到一个 ArgumentException调用 Delegate.CreateDelegate 并显示消息 “无法绑定(bind)到目标方法,因为它的签名或安全透明度与委托(delegate)类型不兼容。” 这发生在使用任何返回原始/值类型的属性,包括结构。

有人知道可以在这里同时使用引用类型和值类型的方法吗?

最佳答案

从根本上说,您的一般方法是不可能的。您能够采用所有非值类型并将它们视为 Func<object> 的原因是依靠逆变( Func<T> 是关于 T 的逆变)。根据语言规范,逆变不支持值类型。

当然,如果您不依赖于使用该方法,问题会更简单。

如果您只想获取值,请使用 PropertyInfo.GetValue方法:

public object GetPropValue(string name)
{
return GetType().GetProperty(name).GetValue(this);
}

如果你想返回一个Func<object>它将在调用时获取值,只需围绕该反射调用创建一个 lambda:

public Func<object> GetPropValue2(string name)
{
return () => GetType().GetProperty(name).GetValue(this);
}

关于C# 通过 Delegate.CreateDelegate 使用具有值类型的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19256233/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com