从父类型的属性子集创建匿名类型

3

我有一个人对象列表,希望能够编程获取一个匿名类型,其中包含该对象的一部分属性。我有一个Person对象列表,如下:(VS 2010 .NET 4.0)。请注意,Person数据存储在数据库中。

var personList = new List<Person>()
 {
      new Person(){ PersonId=11, Weight=100, Race="Green", Height=230},
      new Person(){ PersonId=22, Weight=110, Race="Blue", Height=130}
 };

基于用户选择要查看的特定属性,我想模拟

var query = from c in personList
            select new
             {
                 Weight = c.Weight,
                 Height = c.Height,
                 PersonId = c.PersonId
             };

在这种情况下,用户从用户界面中选择了PersonId、Weight和Height作为他们想要用来创建新的匿名类型的属性。
我有以下代码,将会打印出一个(模拟)用户可能选择的属性的属性值:
PropertyDescriptorCollection props = TypeDescriptor.GetProperties(typeof(Person));
var propList = new List<string>()
{
     "PersonId","Weight","Height"
};

for (int i = 0; i < personList.Count; i++)
{
      for (int j = 0; j < props.Count; j++)
      {
          if (propList.Contains(props[j].Name))
          {
              //properties added to object here..but can't return anonymous type from method....
              Console.WriteLine(props[j].GetValue(personList[i]));
          }
       }
 }

这段代码将会在控制台打印出11、100、230以及22、110、130。

我想要做的就是基本上重建var query...中的代码,但是能够向查询的select new部分传递一列表格。


1
@Brandon,我非常确定这不是问题所在。 - Selman Genç
1
哦,别这样...今天是星期五,笑一笑吧。 - Brandon
1
我见过的所有蓝色人通常符合这个描述。比例检查通过。现在我们可以帮助编写代码了。 - Dmitriy Khaykin
你能分享一下你想要实现的理论方法的签名吗? - Adrian Salazar
@Servy 在我的模型中,通过某种方式选择了一组人员ID(比如说50岁以上)。然后,使用LINQ将该队列的属性与其Person ID进行左连接。这些属性显示为表格,其中一列是对象的属性名称(表格中的一行=对象)。然后,当用户完成时,这些数据将被发送进行一些处理。投影实际上就是表格本身,我只想能够处理数据,并仍然获得动态对象的属性名称。 - wootscootinboogie
显示剩余11条评论
1个回答

0

1
这样做将无法将查询翻译到数据库。 - Servy
我赞同 expando-object 的东西... 我们想要实现的只是动态对象。这将强制 C# 的行为像 JavaScript。 - Adrian Salazar
@Servy 它从未说过有数据库,也没有LINQ to SQL。 - Adrian Salazar
我的错,我没有(现在仍然没有)看到问题中的数据库部分。 - Brandon
1
@Brandon 如果不是在查询数据库,那么这样做就没有任何意义。如果是LINQ到对象,那么没有理由不保留原始对象。 - Servy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接