C#使用具有Delegate.CreateDelegate值类型的属性
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了C#使用具有Delegate.CreateDelegate值类型的属性,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1334字,纯文字阅读大概需要2分钟。
内容图文
以Jon Skeet的文章Making reflection fly and exploring delegates为例,我试图使用Delegate.CreateDelegate方法将属性复制为委托.这是一个示例类:
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”作为参数传递时,在对Delegate.CreateDelegate的调用上收到了ArgumentException消息,消息为“无法绑定到目标方法,因为其签名或安全性不透明”与委托类型兼容.”当使用任何返回原始值/值类型(包括结构)的属性时,就会发生这种情况.
有人知道这里可以同时使用引用和值类型的方法吗?
解决方法:
从根本上讲,您无法采用一般方法.您能够采用所有非值类型并将其视为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值类型的属性全部内容,希望文章能够帮你解决C#使用具有Delegate.CreateDelegate值类型的属性所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。