通用类型参数为params

时间:2014-12-05 17:03:16

标签: c# linq generics expression params

有谁知道为什么会这样做

GetPropertyName(x => x.Ident);

但这不是

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

分别调用这两个方法

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

参数的限制

1 个答案:

答案 0 :(得分:1)

这仅适用于两个属性相同的类型,因为它们都使用&#34; T&#34;。

编译器会告诉你像Type-Arguments这样的东西不能被使用。

修改方法,使其使用对象而不是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作为占位符,因此编译器会尝试找到匹配完整&#34;事物&#34;的T类型。由于你定义了两个表达式,他试图找到两个表达式的工作T,因此这要求你让两个表达式都是相同的类型。