根据在运行时提供的属性,将List转换为List。
根据在运行时提供的属性,将List转换为List。
我有一个Objects
列表,比如说:\n
var animals = new List() //添加动物
\n我知道我可以从这个问题中将它们转换为strings
,例如:\n
Listanimals = new List (); List strings = animals.Select(a => (string)a).ToList();
\n但是我想根据我在运行时提供的属性作为string
来从animals
列表中获取List
\n例如:\n
private ListGetList(string property) { return animals.Select(x => filterByReflection(property)).ToList(); }
\n这样我可以调用:\n
var names = GetList("Name"); var types = GetList("Type"); var ages = GetList("Age");
\n这种方式可行吗?
问题的原因是希望在运行时将一个包含对象的列表转换为只包含特定属性的字符串列表。为了实现这一目标,作者使用了反射来获取属性的值。
解决方法是定义了两个方法,即GetValue
和GetProperty
。其中GetValue
方法接受一个对象和一个属性字符串作为输入,通过反射获取该对象的属性值,并返回该值的字符串表示。如果属性值为空,则返回空字符串。如果输入的对象为空,则返回空字符串。GetProperty
方法接受一个TypeInfo
和一个属性名作为输入,通过递归的方式获取指定属性的PropertyInfo
对象。
然后,通过调用GetList
方法,并传入一个属性名作为参数,可以将包含对象的列表animals
转换为只包含特定属性的字符串列表。在GetList
方法中,使用Select
和GetValue
方法来获取每个对象的属性值,并将其转换为字符串。最后,使用ToList
方法将结果转换为字符串列表并返回。
总之,通过使用反射和递归的方式,可以在运行时将包含对象的列表转换为只包含特定属性的字符串列表。这种方法可以提供灵活性和可重用性,使得可以根据需要动态地选择要转换的属性。
问题的出现原因是需要将一个包含多个对象的列表(List)转换成只包含特定属性的字符串列表(List
在代码中,首先定义了一个名为GetList的方法,该方法接受一个属性名作为参数。在方法内部,使用LINQ的Select方法对animals列表进行遍历,并调用GetProperty方法获取每个对象指定属性的值。GetProperty方法使用反射来获取Animal对象的类型、属性信息,并最终返回属性的值。最后,将获取到的属性值转换成字符串,并使用ToList方法将其添加到结果列表中。最终,GetList方法返回转换后的字符串列表。
通过使用这个方法,可以方便地根据运行时传入的属性来将对象列表转换成特定属性的字符串列表。这种灵活性使得代码可以适应不同的需求,而不需要编写多个针对不同属性的转换方法。同时,使用LINQ和反射的方式实现了通用的转换逻辑,避免了重复的代码。
问题的出现原因是需要将一个对象列表(List
解决方法是使用LINQ的Select方法,结合反射来获取对象的属性值。具体步骤如下:
1. 定义一个静态的Animal对象列表(animals)。
2. 编写一个静态方法(GetList),接收一个字符串参数(property)。
3. 在GetList方法中,使用LINQ的Select方法对animals列表进行遍历。
4. 在Select方法中,使用反射获取每个对象的指定属性(property)的值。
5. 使用GetValue方法获取属性值,并将其转换为字符串。
6. 将转换后的字符串添加到一个新的字符串列表中。
7. 最后,返回这个新的字符串列表。
以上代码中的例子,传入的属性是"Age",所以返回的字符串列表将是每个动物对象的年龄。
完整的代码示例如下:
class Program { static Listanimals = new List (); static void Main(string[] args) { animals.Add(new Animal() { Age = 3, Name = "Terry", Type = "Tiger" }); animals.Add(new Animal() { Age = 1, Name = "Bob", Type = "Badger" }); animals.Add(new Animal() { Age = 7, Name = "Alfie", Type = "Dog" }); GetList("Age").ForEach(Console.WriteLine); Console.Read(); } public static List GetList(string property) { return animals.Select(o => o.GetType().GetProperty(property).GetValue(o).ToString()).ToList(); } } class Animal { public string Name { get; set; } public string Type { get; set; } public int Age { get; set; } }
运行以上代码,输出结果为:
3 1 7
上述代码演示了如何将对象列表(List