2014-12-05 132 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