【问题标题】:C# passing a list of strongly typed property namesC# 传递强类型属性名称列表
【发布时间】:2013-06-11 11:11:09
【问题描述】:

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

找到了这篇文章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 以允许调用者想要的尽可能多的属性?我尝试使用 Add in List 并使用 Expression

提前致谢

编辑:今晚我确实找到了几篇文章,这些文章提到了使用 C# param 关键字来完成此操作。有没有更好或更有效的方法,或者这是最好的方法?

【问题讨论】:

  • 你在用这个做类型映射吗?如果是这样,你可能想看看AutoMapper
  • List&lt;Func&lt;Object&gt;&gt; propertiesToCopy 有什么问题?
  • Andrei,我相信当我尝试这样做时,使用 Add() 方法对添加它们并不满意,这是否比使用参数更好?
  • @MatthewWatson - 我不想使用对我有用的东西。我正在尝试在这个特定项目中使用少量第三方的东西。

标签: c# generics generic-list lambda


【解决方案1】:

使用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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-30
    • 2018-02-02
    • 1970-01-01
    相关资源
    最近更新 更多