2

我有一些代码片段如下:

想通过在运行时检查类型来解决这种情况。

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 typeGeneric parameter argumentIfstring, decimal, double etc..

您能否让我知道该解决方案,因为我想property在运行时检查类型并希望使用Generic parameter typeproperty 相同的类型进行创建。

4

1 回答 1

1

有一个返回的方法Func<T,V>(对于 objectT和 member-type V)是有问题的,因为在运行时你不能真正用它做任何有用的事情。您不能在编译时不知道Tand的情况下将其分配给类型化委托,并且使用不是一个好主意。坦率地说,您最好构建一个,并在运行时处理。反射和泛型不能很好地混合。VDynamicInvokeFunc<object,object>object

private static Func<object, object> BuildExpression(
    Type type, string propertyName)
{
    var parameter = Expression.Parameter(typeof(object));
    var body = Expression.TypeAs(Expression.PropertyOrField(Expression.TypeAs(
        parameter, type), propertyName), typeof(object));
    return Expression.Lambda<Func<object, object>>(body, parameter).Compile();
}

但是,此时您可以,IMO,只需切换到FastMember 之类的库,并使用基于名称的访问:

var accessor = TypeAccessor.Create(type);
var obj = ...
var propVal = accessor[obj, propertyName];
于 2012-11-06T10:49:52.480 回答