gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 14:55:20 25 4
gpt4 key购买 nike

我有一个动态属性列表,可以根据每个请求频繁更改。

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 的遗留代码,所以我无权更改 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#

最佳答案

您可以使用 dynamic 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. Dynamic LINQ 支持 EF,因此您可以直接从 DB 中获取数据
  2. 您可以毫无问题地将 result 序列化为 JSON - DynamicClass 是使用属性构建的。

关于c# - Linq 选择动态属性列表到另一个对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25499452/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com