gpt4 book ai didi

c# - 动态创建属性

转载 作者:太空宇宙 更新时间:2023-11-03 21:12:29 24 4
gpt4 key购买 nike

所以我有一个包含很多属性的对象,PropertyNameYear1PropertyNameYear2PropertyNameYear3... 20 年了。这些属性可能会随着时间的推移而增长,因此将来我可能需要添加 PropertyNameYear21 等等。

我正在尝试获取这些属性,包括它们的名称和值,但不指定每一个属性,因为理论上我可以拥有数十个属性。我可以使用 LINQ 和 Object Initializer 来完成,但是我必须指定每个属性两次:

new {
PropertyNameYear1 = f => f.PropertyNameYear1,
PropertyNameYear2 = f => f.PropertyNameYear2,
...
};

我如何使用 LINQ(和 Refelction?)将所有这些属性(并且只有这些属性,假设有其他属性的名称不同于 PropertyNameYearX)到一个新的/另一个对象中并返回它对象?

这是我正在寻找的伪代码:

public ReturnType GetSomeObjectWithSpecificProperties(int ID){
var list = SomeObjectRepository.Where(f => f.ID == ID);
var props = list.GetType().GetProperties().ToList();
var SomePropObjectList = props.Where(f => f.Name.Contains("PropertyNameYear")).ToList();

var listToReturn = SomePropObjectList.Select(f => new {
f.Name = f.GetValue(list)
}).ToList();

return listToReturn;
}

最佳答案

我想插话说你应该重新考虑你的方法。

而不是:

public class NotGood
{
public int PropertyNameYear1{ get; set; }
//repeat 20 times...
public int PropertyNameYear21{ get; set; }
}

...考虑:

public class Better
{
public List<int> PropertyNameYears{ get; } = new List<int>();
}

这是一行代码,而且扩展性更好。另外,您消除了所有笨拙的、基于反射的解析。

编辑:正如我在评论中提到的,有时清理代码的正确方法是与作者讨论错误的代码,而不是调整您的代码以适应它们引起的问题,但如果没有办法解决,这里有一种方法需要四行代码:

var obj = new
{
SomeNormalProp = "foo",
ThisIsSilly1 = 1,
ThisIsSilly2 = 2,
ThisIsSilly3 = 3,
ThisIsSilly4 = 4
};

dynamic barfObj = new ExpandoObject();
foreach (var prop in obj.GetType().GetProperties())
if (prop.Name.StartsWith("ThisIsSilly"))
//add property dynamically
((IDictionary<string, object>)barfObj).Add(prop.Name, prop.GetValue(obj));

//now barfObj is exactly what you want.
var sampleVal = barfObj.ThisIsSilly1;
var json = JsonConvert.SerializeObject(barfObj);

或者如果你是一个真正的受虐狂,你有 Reflection.Emit: How to dynamically create a class in C#?

关于c# - 动态创建属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36758638/

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