繁体   English   中英

Linq选择动态属性列表到另一个对象?

[英]Linq Select list of dynamic properties into another Object?

我有一个属性列表,这些属性将是动态的,并且可以在每个请求上频繁更改。

var dynamicFields = new List<string>{ "UserName", "UserEmail" }; 

我有另一个类列表,其中包含所有dynamicFields和其他字段。

var staticFields = new List<StaticFields>
    {
        new StaticFields {UserName = "Chandra", UserDepartment = "IT", UserCity = "Bangalore", UserEmail = "abc@gmail.com"},
        new StaticFields {UserName = "Sekar", UserDepartment = "CSE", UserCity = "Bangalore", UserEmail = "xyz@gmail.com"},
        new StaticFields {UserName = "Dilip", UserDepartment = "IT", UserCity = "Bangalore", UserEmail = "cba@gmail.com"}
    };

public class StaticFields
{
    public string UserName {get; set;}
    public string UserDepartment {get; set;}
    public string UserCity {get; set;}
    public string UserEmail {get; set;}
    //etc..
}

-

我必须只选择在dynamicFields列表中的字段。

那么如何使用for循环或使用LINQ在C#中实现这一点呢?

编辑:

用途仅用于显示显示中的选定列。 我正在使用SP从DB中获取所有数据。 它是db的遗留代码,因此我无权访问更改DB存储过程。

我在JS中试过下面的代码。

var i;
var properties = [
 'UserName',
 'UserEmail'
];
for (i = 0; i < properties.length; i += 1) {
 document.writeln(properties[i] + ': ' + another_object[properties[i]]);
}

我必须将此代码转换为C#

您可以使用具有适当扩展名的动态LINQ

public static T GetValue<T>(this DynamicClass dynamicObject, string propName)
{
    if (dynamicObject == null)
    {
        throw new ArgumentNullException("dynamicObject");
    }

    var type = dynamicObject.GetType();
    var props = type.GetProperties(BindingFlags.Public 
                                 | BindingFlags.Instance 
                                 | BindingFlags.FlattenHierarchy);
    var prop = props.FirstOrDefault(property => property.Name == propName);
    if (prop == null)
    {
        throw new InvalidOperationException("Specified property doesn't exist.");
    }

    return (T)prop.GetValue(dynamicObject, null);
}

public static string ToDynamicSelector(this IList<string> propNames)
{
   if (!propNames.Any()) 
       throw new ArgumentException("You need supply at least one property");
   return string.Format("new({0})", string.Join(",", propNames));
}

然后你可以像这样使用它:

using System.Linq.Dynamic;
...

var result = staticFields.AsQueryable().Select(dynamicFields.ToDynamicSelector())
                                       .Cast<DynamicClass>();

foreach (var item in result)
{
    Console.WriteLine(item.GetValue<string>(list[0]); // outputs all user names
}

备注:

  1. 动态LINQ支持EF,因此您可以直接从DB获取数据
  2. 您可以将result序列化为JSON而不会出现任何问题 - DynamicClass是使用属性构建的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM