gpt4 book ai didi

c# - 根据属性名称数组创建对象的子集

转载 作者:太空狗 更新时间:2023-10-29 21:38:54 25 4
gpt4 key购买 nike

我有一个类和一个属性名称数组,定义如下:

public class Dog {
public string Name { get; set; }
public string Breed { get; set; }
public int Age { get; set; }
}

var desiredProperties = new [] {"Name", "Breed"};

我还有一个返回狗对象列表的方法:

List<Dog> dogs = GetAllDogs();

有没有一种方法可以返回仅包含 desiredProperties 数组中定义的属性的 dogs 子集?最终,这个结果列表将被序列化为 JSON。

考虑到将允许用户指定属性的任意组合(假设它们都有效)作为数组中的输出,我已经为这个问题苦苦挣扎了一段时间。更多示例:

var desiredProperties = new [] {"Name", "Age"};
// Sample output, when serialized to JSON:
// [
// { Name: "Max", Age: 5 },
// { Name: "Spot", Age: 2 }
// ]

var desiredProperties = new [] {"Breed", "Age"};
// [
// { Breed: "Scottish Terrier", Age: 5 },
// { Breed: "Cairn Terrier", Age: 2 }
// ]

最佳答案

你可以写一个函数来做到这一点。使用下面的扩展方法。

public static class Extensions
{
public static object GetPropertyValue(this object obj, string propertyName)
{
return obj.GetType().GetProperty(propertyName).GetValue(obj);
}

public static List<Dictionary<string, object>> FilterProperties<T>(this IEnumerable<T> input, IEnumerable<string> properties)
{
return input.Select(x =>
{
var d = new Dictionary<string, object>();
foreach (var p in properties)
{
d[p] = x.GetPropertyValue(p);
}
return d;
}).ToList();
}
}

像这样测试

var dogs = GetAllDogs();

var f1 = dogs.FilterProperties(new[]
{
"Name", "Age"
});

var f2 = dogs.FilterProperties(new[]
{
"Breed", "Age"
});

Console.WriteLine(JsonConvert.SerializeObject(f1));
Console.WriteLine(JsonConvert.SerializeObject(f2));

结果是

[{"Name":"Spot","Age":2},{"Name":"Max","Age":5}]
[{"Breed":"Cairn Terrier","Age":2},{"Breed":"Scottish Terrier","Age":5}]

关于c# - 根据属性名称数组创建对象的子集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31011716/

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