c# - 从 MethodInfo 创建委托时出错
问题描述
我对另一个问题提出了建议,以替换这段代码:
string ent = c.GetType().GetProperty(prop).GetGetMethod().Invoke(c, null).ToString();
有一个可以做同样事情的委托(但在性能方面应该快得多)。
这是我到目前为止提出的:
TestClass test = new TestClass (){DummyProp= "appo"};
string prop = "DummyProp";
MethodInfo method = typeof(TestClass ).GetProperty(prop).GetGetMethod();
Func<TestClass , string> getter= (Func<TestClass , string>)
Delegate.CreateDelegate(typeof(Func<TestClass , string>), test, method);
Console.WriteLine(getter(test));
我要做的是在运行时获取 的实例中的属性值,TestClass
该属性可以是其中的许多属性之一,并且需要哪个属性由某些条件决定
问题是我得到以下异常“目标方法无法绑定,因为它的签名或安全透明度与委托类型不兼容”。我错过了什么?
解决方案
这条线是问题所在:
Delegate.CreateDelegate(typeof(Func<TestClass, string>), test, method);
您正在尝试创建一个开放委托,即未绑定到任何特定实例的委托 - 但您正在传递实例。如果将其更改为:
Delegate.CreateDelegate(typeof(Func<TestClass, string>), method);
然后它将创建一个适当的开放委托。
推荐阅读
- javascript - 按属性名称搜索嵌套对象并复制到新对象不会导致所有对象都被复制
- assembly - 当前视频缓冲区段地址是否记录在内存位置?
- intellij-idea - Intellij IDEA 未在项目中显示 src 文件夹
- web-services - GPS 跟踪器到自定义 Web 服务
- linux - pageup 和 pagedown 在使用 konsole 的 vim 中不起作用
- java - Hibernate:如何将“具有”子类的类映射到单个表?
- android - 是否可以在 Android Emulator 文件系统(在我的计算机内)中搜索文件?
- angular - Angular:如果我们将 .js 或 .ts 放在 import 语句的末尾,则依赖注入不会正确发生
- c# - 由于传递依赖,提供运行时标识符时,Dotnet 还原失败
- r - 提取 1:1000 中从第一个数字开始的所有数字==2