[c#]作为参数的泛型类型参数。

标签: Linq C#
发布时间: 2017/2/28 21:40:34
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

有谁知道这是什么原理

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

Params 的局限性

解决方法 1:

这只有当作品这两个属性都是相同的类型,因为两者都使用"T"。

编译器将告诉你一些像类型参数不能推论从用法。

修改的方法,使其使用对象而不是 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 的类型。由于您定义两个表达式,他试图找到工作 T 的两个表达式,因此这要求要有两个表达式都为同一类型。

官方微信
官方QQ群
31647020