我有一个有几个属性的类:
class Person
{
string Name;
int Age;
DateTime BirthDate;
}
然后我有一个带List<Person>
的包装类。在这个包装器类中,我希望能够执行Wrapper["Name"]
之类的操作,使用new List<string>
返回.Select(x=>x.Name)
。
如何围绕支持将字符串映射到Property名称的IEnumerable创建包装类?像下面的伪代码,但显然它不起作用。我99.9%肯定解决方案必须使用Reflection,那很好。
class Wrapper
{
List<Person> PersonList;
List<dynamic> this[string Column]
{
return PersonList.Select(x => x.[Column]).ToList();
}
}
这可能看起来不是一个好的设计,但它最终能够从.NET 2.0开始实现正确的设计。正如我现在所知,数据存储在列中,因此我的班级中实际上有一个列表列表。
使用上面的例子,会有三个IList(带有字符串Title)Name,Age和Birthdate。
目前所有事情都是基于他们的&#34;字符串&#34;名称。我试图将数据结构转换为基于IEnumberable接口的行,以便最终允许Linq保持当前代码的功能。
将代码转换为基于行的IEnumberable是个好主意吗?
答案 0 :(得分:1)
这样的东西?
using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
namespace WindowsFormsApplication2
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
var test = new Wrapper();
var test2 = test.GetValue<String>("Name");
foreach (var val in test2)
{
Console.WriteLine(val);
}
}
}
}
class Person
{
public string Name;
int Age;
DateTime BirthDate;
}
public class Wrapper
{
List<Person> PersonList = new List<Person> { new Person() { Name = "rob" }, new Person() { Name = "Test" } };
public List<Object> GetValue(String column)
{
return GetValue<Object>(column);
}
public List<T> GetValue<T>(String column)
{
if (PersonList.Count > 0)
{
var field = PersonList.FirstOrDefault().GetType().GetField(column);
if (field == null)
return null;
return PersonList.Select(person => (T) field.GetValue(person)).ToList();
}
return null;
}
}
编辑:没有看到您需要通过字符串名称访问
答案 1 :(得分:1)
我更喜欢这样的设计
class Wrapper
{
List<Person> PersonList;
List<T> GetColumns<T>(Func<Person, T> func)
{
return PersonList.Select(p => func(p)).ToList();
}
}
这使列访问强类型,你可以得到像这样的所有名称
IList<string> names = wrapper.GetColumns(p => p.Name);
IList<DateTime> birthDates = wrapper.GetColumns(p => p.BirthDate);
答案 2 :(得分:0)
您可以使用DictionaryBase来实现您的Wrapper。这是一个非常基本的包装类,它只返回一个列表,应该注意附加所有具有相同名称的人在Wrapper [name]中附加。
class Wrapper : DictionaryBase
{
public List<Person> this[string key]
{
get
{
return this[key];
}
}
}