【问题标题】:C# Create object with dynamic properties : LINQ select List<object> values by property names arrayC# 创建具有动态属性的对象:LINQ 按属性名称数组选择 List<object> 值
【发布时间】:2015-11-22 16:35:04
【问题描述】:
class OriginalObject
        {
            public string str1  {get;set;}
            public string str2 { get; set; }
            public string str3 { get; set; }
            public string str4 { get; set; }

        }
        class Program
        {
            static void Main(string[] args)
            {           

                List<OriginalObject> obj = new List<OriginalObject>();
                obj.Add(new OriginalObject()
                {
                    str1 ="hi",
                    str2 = "hello",
                    str3 = "how",
                    str4 = "r u"
                });

                obj.Add(new OriginalObject()
                {
                    str1 = "i",
                    str2 = "am",
                    str3 = "fine",
                    str4 = "great"
                });

                var PropertyNames = new[] { "str1","str4"};

             //var result = Select from obj only column names that present in PropertyName Array 
                // Expected
                //obj --->
                //          {str1 = "hi",str4="r u"}
                //          {str1 = "i",str4="great"}


            }
        }   

【问题讨论】:

  • obj.Select(x =&gt; new { str1 = x.str1, str4 = x.str4 }) 但我认为拥有动态属性并不容易。

标签: c# linq


【解决方案1】:

其中一种方法:

var properties = typeof(OriginalObject).GetProperties()
                                       .Where(p => PropertyNames.Contains(p.Name))
                                       .ToList();
var output = obj.Select(o => {
    dynamic x = new ExpandoObject();
    var temp = x as IDictionary<string, Object>;
    foreach(var property in properties)
        temp.Add(property.Name, property.GetValue(o));
    return x;
});

转储结果:

foreach(dynamic x in output)
{
    Console.WriteLine(x.str1);
    Console.WriteLine(x.str4);
}

【讨论】:

  • 这就是所要求的解决方案,但我不知道如何动态使用它。我正在创建相同的解决方案但停止了,因为有一个运行时数组定义了要获取的属性。没有机会创建“转储结果”代码,因为您无法在编译时编写它。知道这一点,您不需要使用动态。包含值的字典就足够了。
  • @Verarind 您可能想提出新问题来澄清您的目标...目前尚不清楚您打算如何使用结果对象 - 所以动态听起来是这个问题的完美答案...如果您需要真正的静态类型 - 在运行时创建一个 - stackoverflow.com/questions/16838136/…
  • @Verarind 选项之一可能是在网格中显示数据。
  • @AlexeiLevenkov Vera rind 不是提出这个问题的人 :)
  • @Verarind 抱歉...您可以获得属性列表 - stackoverflow.com/questions/2634858/… 以及名称为 stackoverflow.com/questions/4939508/… 的属性。您还可以构建表达式树来转储数据...
【解决方案2】:

试试这个

var result = obj.Select(x => new 
             { 
                  x.str1, 
                  x.str4 
             }).ToList();

【讨论】:

  • 这正是我的评论所说的,但我认为属性应该从 PropertyNames 动态获取。
  • 动态属性是什么意思?
  • 您的新匿名类型包含名为str1str4 的编译时常量属性。任务是创建一个对象,该对象从名为PropertyNames 的运行时对象中获取其属性。在指定的情况下,有str1str4,但在其他情况下,还有其他属性可供选择。
  • 看看 Ulugbek Umirov 的回答。这可以按要求解决问题。 (该死的他只比我快几秒钟)。
  • 我在这篇文章中没有看到 PropertyNames 的用法...不太确定您建议如何在运行时使用基于此示例的给定属性构造类型。
猜你喜欢
  • 1970-01-01
  • 2020-11-03
  • 1970-01-01
  • 2013-07-23
  • 1970-01-01
相关资源
最近更新 更多