2014-12-05 165 views
0

有誰知道爲什麼這個工程泛型類型參數作爲PARAMS

GetPropertyName(x => x.Ident); 

但這並不

GetPropertyNames(x => x.Ident, x => x.Name); 

分別調用這兩個方法則params的

public static string GetPropertyName<T>(Expression<Func<DTO, T>> pExpression) 
{ 
    MemberExpression me = pExpression.Body as MemberExpression; 
    if (me != null) { return me.Member.Name; } 

    UnaryExpression ue = pExpression.Body as UnaryExpression; 
    me = ue.Operand as MemberExpression; 
    if (me != null) { return me.Member.Name; } 

    return null; 
} 

public static string[] GetPropertyNames<T>(params Expression<Func<DTO, T>>[] pExpressions) 
{ 
    List<string> propertyNames = new List<string>(); 
    foreach (Expression<Func<DTO, T>> expression in pExpressions) 
    { 
     propertyNames.Add(GetPropertyName(expression)); 
    } 
    return propertyNames.ToArray(); 
} 

限制

+2

你得到的錯誤是什麼? Indent和Name是同一類型嗎? – DLeh 2014-12-05 17:04:44

回答

1

Thi只有當兩個屬性都是相同類型時才起作用,因爲兩者都使用「T」。

編譯器會告訴你類似參數不能從用法中得到的東西。

修改的方式來提高其使用對象,而不是牛逼這樣的:

public static string[] GetPropertyNames(params Expression<Func<DTO, object>>[] pExpressions) 
{ 
    List<string> propertyNames = new List<string>(); 
    foreach (Expression<Func<DTO, object>> expression in pExpressions) 
    { 
     propertyNames.Add(GetPropertyName(expression)); 
    } 
    return propertyNames.ToArray(); 
} 

,它應該工作。

牛逼的作品作爲一個佔位符,所以編譯器試圖找到對於T相匹配的完整的「東西」的類型。既然你定義了兩個表達式,他試圖爲這兩個表達式找到一個工作的T,因此這需要你讓這兩個表達式具有相同的類型。

+0

從技術上講,兩者不必是相同的類型。如果一種類型可以隱式轉換爲另一種類型,它也可以工作。 – juharr 2014-12-05 18:45:25