我现在有一个获取对象属性类型的函数,如下所示:
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);