C#使用动态属性创建对象:LINQ按属性名称数组选择List <object>值

时间:2015-08-28 05:25:27

标签: c# linq

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"}


            }
        }   

2 个答案:

答案 0 :(得分:14)

如何做到这一点的方法之一:

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

答案 1 :(得分:0)

试试这个

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