A类的数组索引属性

时间:2011-01-08 05:59:32

标签: c# linq

我有一个有几个属性的类:

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是个好主意吗?

3 个答案:

答案 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];
        }
    }
}