2015-10-07 79 views
0

我目前有一個函數可以獲取一個對象屬性的類型,它可以在下面看到。現在基於動態/表達式的方法來獲取類的屬性類型?

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); 

表達式是相當新的給我和IM試圖轉換這半小時已經和無濟於事。

你們能幫我把這個轉換成基於對象的類嗎?

謝謝。

回答

0

您需要將表達式參數更改爲對象試試這個。

 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; 
    } 

更新:表達身體需要被鑄造到UnaryExpression上面應該工作 然後你可以使用它作爲

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

或者

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

不適用於至少值類型。 – Bas

+0

試過這個,總是得到類型的對象 – user1465073

1

在你現在的做法你」 d寫:

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; 
} 

爲什麼怪異UnaryExpressionif聲明?如果您的房產類型不是object類型,則表達式將評估爲_ => ((object)_.Property)UnaryExpression是類型轉換部分,我們正在那裏消除。

相關問題