我一直在使用委托而不是反射来测试某些对象排序,并且它对字符串属性有效,但如果我尝试使用Int(或DateTime),它会失败并且抛出尝试访问Int或DateTime属性时,Open Delegate失败
错误绑定到目标方法。
class Program
{
static void Main(string[] args)
{
var sample = new SampleClass() { Num = 13, Text = "Sample" };
Console.WriteLine(ReadProp(sample,"Text")); //Works
Console.WriteLine(ReadProp(sample, "classProp")); //Works
Console.WriteLine(ReadProp(sample, "Num")); //Throws 'Error binding to target method.'
}
//Use a Delegate to improve speed of accessing property instead of reflection
static object ReadProp(SampleClass obj, string propName)
{
var method = obj.GetType().GetProperty(propName).GetGetMethod();
var getForProp = (Func<SampleClass, object>)Delegate.CreateDelegate(typeof(Func<SampleClass, object>), null, method);
return getForProp(obj);
}
}
//A sample class for illustration purposes
class SampleClass
{
public string Text { get; set; }
public int Num { get; set; }
public SampleClass classProp { get; set; }
}
我的问题是:为什么它的字符串或其他类而不是诠释或日期时间工作?
我可以看到,如果我改变Func<SampleClass, object>
到Func<SampleClass, int>
它就会为我诠释工作,但我希望对象将两个工作。
是的,我真正的代码只创建一次委托 – deepee1 2012-03-02 21:03:40
感谢您的链接,我会看看。在我的情况下,我不知道设计时的返回类型,并且必须在运行时确定属性返回类型 – deepee1 2012-03-02 21:08:32
@ deepee1:链接中的代码就是这样 - 你给它一个'MethodInfo',它给你一个'Func'。通用方法在创建委托时通过反射调用。 –
2012-03-02 21:13:03