Linq将动态属性列表选择到另一个对象中
本文关键字:一个对象 选择 列表 动态 属性 Linq | 更新日期: 2023-09-27 18:19:34
我有一个属性列表,这些属性是动态的,可以在每次请求时频繁更改。
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列表中的字段。
那么,我如何在C#中使用for循环或使用LINQ来实现这一点呢?
编辑:
用途用于在显示中仅显示选定的列。我正在使用SP从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
}
备注:
- Dynamic LINQ支持EF,因此您可以直接从DB中获取数据
- 您可以毫无问题地将
result
序列化为JSON——DynamicClass
是用属性构建的