C#传递强类型属性名称列表

时间:2013-06-11 11:11:10

标签: c# generics generic-list lambda

我正在寻找一种方法将一个强类型属性名称列表传递给一个方法,然后我可以解析并获取调用者感兴趣的属性。我想这样做的原因是要有一个复制方法,仅复制用户指定的字段。现在,该方法采用一个字符串列表与Getvalues一起使用,并在反射中获取属性方法,但我想防止重构属性和开发人员未更新的字符串。

我发现了这篇文章Here,但不幸的是,它没有列表。我可以这样做:

public static void Copy(Expression<Func<TObject>> propertiesToCopy )
{
}

然后让来电者

PropertyCopier<List<string>>.Copy(() => data);

但是我必须指定调用者可以拥有的属性数量:

public static void Copy(Expression<Func<TObject>> propertiesToCopy,Expression<Func<TObject>> propertiesToCopy2, Expression<Func<TObject>> propertiesToCopy3 )
{
}

这将允许三个属性。无论如何都要将它添加到List或Queryable&lt;&gt;允许与调用者一样多的属性?我尝试使用Add in List并使用Expression

提前致谢

编辑:我今晚发现了一些文章,指的是使用C# param 关键字来完成此操作。是否有更好或更有效的方法,或者这是最好的方法吗?

1 个答案:

答案 0 :(得分:10)

使用params关键字定义一个采用可变数量参数的方法:

public static void PrintPropertyNames<T>(params Expression<Func<T, object>>[] properties)
{
    foreach (var p in properties)
    {
        var expression = (MemberExpression)((UnaryExpression)p.Body).Operand;
        string memberName = expression.Member.Name;
        Console.WriteLine(memberName);
    }
}

例如,你可以调用 PrintPropertyNames 方法传递两个表达式:

PrintPropertyNames<FileInfo>(f => f.Attributes, f => f.CreationTime);

此示例向控制台显示以下输出:

Attributes
CreationTime