【发布时间】:2012-11-06 10:36:58
【问题描述】:
我有一些代码 sn-p 如下所示:
想通过在运行时检查类型来解决这种情况。
PropertyInfo pi = type.GetProperty("propertyName");
var expression = new Object(); // this give me error after expression runs!
// Want to resolve this conditation by checking the type at runtime.
if (pi.PropertyType == typeof(DateTime))
{
// Want to pass the generic type parameter which has a same type created at runtime by identifying the property type.
expression = BuildExpression<T, DateTime>(data, group.Member);
}
private Func<T, V> BuildExpression<T, V>(IEnumerable<T> items, string propertyName)
{
Type type = typeof(T);
PropertyInfo pi = type.GetProperty(propertyName);
Type PropertyType = pi.DeclaringType;
var parameter = Expression.Parameter(typeof(T), propertyName);
var cast = Expression.TypeAs(parameter, pi.DeclaringType);
var getterBody = Expression.Property(cast, pi);
var exp = Expression.Lambda<Func<T, V>>(getterBody, parameter);
return exp.Compile();
}
问题: 我必须在类型上写条件我必须通过反射检查属性的类型,然后必须构建表达式。
我想要什么: 我想检查属性类型的运行时时间,并想构建与属性类型相同的该类型的运行时通用参数。
基本上我想删除If 条件关于类型检查 而我想要的是,代码应该automatically detect the property type 并在Generic parameter argument 中传递相同的类型,这样我就不会'不必检查所有具有If 条件的类型。喜欢string, decimal, double etc..
能否请您告诉我该解决方案,因为我想在运行时检查 property 类型并希望创建具有 与属性相同类型的 Generic parameter type。
【问题讨论】:
-
那么,您的
BuildExpression方法是什么?它可以采用Type参数而不是T泛型吗? -
Marc,它采用泛型参数类型。我在问题中添加了相同的方法。
-
你的
expression局部变量的类型是什么? -
我想知道,因为我不确定如何初始化我的局部变量,因为在运行时不同的类型检查会有所不同。我已经将上面的代码发布在我认为应该的位置喜欢它。但不知道如何处理这种类型的条件......我已经用“var expression = new Object();”进行了初始化,但在表达式运行后它给了我错误!
标签: c# .net linq generics lambda