基于动态/表达式的方式获取类的属性类型



我现在有一个获取对象属性类型的函数,如下所示:

private static Type GetPropertyType<TClass, TResult>(Expression<Func<TClass, TResult>> propertyExpression)
{
    Type type = propertyExpression.Body.Type;
    if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>))
    {
        type = Nullable.GetUnderlyingType(type);
    }
    return type;
}

现在,这里的问题是,我需要有一个对象的实例,我打算获得属性的类型,如下所示

var baseZoneTypeEntity = zoneTypeCollection.First();
Type t = GetPropertyType(() => baseZoneTypeEntity.BonusAmount);

我希望你传递类而不是传递实例,所以

Type t = GetPropertyType<ZoneTypeClass>(_ => _.BonusAmount);

表达式对我来说很新,我已经花了半个小时试图转换它,但无济于事。

你们能帮我把这个从一个基于对象的转换成一个基于类吗?

谢谢。

在您当前的方法中,您应该写:

Type t = GetPropertyType<ZoneTypeClass, int>(_ => _.BonusAmount)

这是多余的,因为您要么必须传入一个实例,要么必须指定结果类型。您可以重写该方法,使其不关心结果类型,而将其保留为object。这是可能的,因为您正在检查表达式体,允许在您的问题中发布所需的行为(使用_ => _.Property)。

static Type GetPropertyType<TObject>(Expression<Func<TObject, object>> propertyExpression)
{
    var expression = propertyExpression.Body;
    var unaryExpression = expression as UnaryExpression;
    if (unaryExpression != null)
    {
        expression = unaryExpression.Operand;
    }
    Type type = expression.Type;
    if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>))
    {
        type = Nullable.GetUnderlyingType(type);
    }
    return type;
}

为什么奇怪的UnaryExpression if语句?如果您的属性类型不是object类型,则表达式将计算为_ => ((object)_.Property)UnaryExpression是类型转换部分,我们在这里去掉了。

您需要将表达式参数更改为object try this.

      private static Type GetPropertyType<TClass>(Expression<Func<TClass, object>> propertyExpression)
    {
        var unaryExpression = propertyExpression.Body as UnaryExpression;
        if (unaryExpression == null) return propertyExpression.Body.Type;
        var type = unaryExpression.Operand.Type;
        if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof (Nullable<>))
        {
            type = Nullable.GetUnderlyingType(type);
        }
        return type;
    }

UPDATED:表达式体需要被强制转换为UnaryExpression,上面应该可以工作然后你可以用

 var type= GetPropertyType<CustomerEntity>(x => x.FirstName);

    var type= GetPropertyType<ProductEntity>(_ => _.Price);

相关内容

  • 没有找到相关文章

最新更新