我得到了另一个问题的建议,替换这段代码:
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);
然后,它将创建一个适当的打开委托。