如何将单一类型的类属性转换为该类型的列表

How to convert class properties of single type to list of that type

提问人:Jonas Mohammed 提问时间:5/4/2022 更新时间:5/4/2022 访问量:805

问:

给定以下类:

class MyClass {
    readonly MyType Object1 = new MyType { Prop1="Prop I want", Prop2="Prop I dont want"}
    readonly MyType Object2 = new MyType { Prop1="Prop I want", Prop2="Prop I dont want"}
    readonly MyType Object3 = new MyType { Prop1="Prop I want", Prop2="Prop I dont want"}
    readonly MyType Object4 = new MyType { Prop1="Prop I want", Prop2="Prop I dont want"}
    // etc, there are 100+ in this class, all of the type MyType
}

有没有办法将其转换为类型或道具的列表?MyTypeProp1

该类仅包含 类型的属性。MyType

C# LINQ 类型 反射 转换

评论

0赞 McNets 5/4/2022
你是说自动吗?
0赞 Jonas Mohammed 5/4/2022
如果“自动”是指通过编写代码来转换它,是的。我不想手动列出清单,因为对象太多了,以后可能会有更多。
1赞 CSharpie 5/4/2022
@JonasMohammed您需要使用 Reflection。只要搜索一下,你就会找到大量的答案。
0赞 McNets 5/4/2022
你们都是会员吗?private readonly
0赞 NetMage 5/4/2022
你的意思是对象太多,还是类中的属性太多,或者类太多?

答:

2赞 dcronqvist 5/4/2022 #1

为此,我们将使用 Reflection 来获取 中所有字段属性中所有字符串的列表。Prop1MyClass

假设你有一些实例 ,你可以用一个简单的单行代码来获取字符串列表,如下所示:MyClass

MyClass instance = new MyClass(); // This could of course be gotten from somewhere else.

List<string> prop1s = instance.GetType().GetRuntimeFields().Select(p => (MyType)p.GetValue(instance)).Select(p => p.Prop1).ToList();

如果你突然想在里面获取一些其他属性,你可以简单地更改你在最后一个中选择的属性。MyTypeSelect()

在这里,我们使用反射来获取类型内的所有字段 (),并且由于我们知道所有字段都是类型,因此我们可以将所有字段转换为该类型,然后只需选择属性即可。最后,我们只是把它作为一个列表,你当然可以把它作为一个或一个数组,但希望这应该向你展示你如何获得你想要的属性作为列表。.GetRunTimeFields()MyClassMyTypeMyTypeProp1ToList()IEnumerable<string>

相反,如果您只想有一个列表,那么您可以跳过最后一个,如下所示:MyTypeSelect()

List<MyType> myTypes = instance.GetType().GetRuntimeFields().Select(p => (MyType)p.GetValue(instance)).ToList();