【问题标题】:Create anonymous types from subset of parent type's properties从父类型属性的子集创建匿名类型
【发布时间】:2023-03-28 21:39:01
【问题描述】:

我有一个人员对象列表,我希望能够以编程方式获取包含该对象属性子集的匿名类型。我有一个 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 部分。

【问题讨论】:

  • @Brandon 我很确定这不是问题
  • 哦,现在来吧...今天是星期五,笑吧。
  • 我见过的所有蓝色人通常都符合这个描述。比例检查。我们现在可以帮助编写代码。
  • @DavidKhaykin 这些是玩具人,他们的称重是基于对数刻度。
  • 你能分享你想要实现的理论方法的签名吗?

标签: c# dynamic


【解决方案1】:

你见过this thread?

它将海报引用到 MSDN 上的ExpandoObject,它允许您动态创建匿名类型。

【讨论】:

  • 这将不允许将查询翻译到数据库。
  • 我支持expando-object的东西......我们在这里想要实现的只是动态对象。它强制 C# 表现得像 JavaScript
  • @Servy 它从来没有说没有数据库也没有 LINQ to sql
  • 我的错,我没有(现在仍然没有)看到问题的数据库部分。
  • @Brandon 如果不查询数据库,这样做实际上毫无意义。如果是 LINQ to objects,就没有理由不保留原始对象。
猜你喜欢
  • 2017-07-14
  • 2016-01-30
  • 2010-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多