代码之家  ›  专栏  ›  技术社区  ›  anivas

Linq中的泛型属性getter

  •  0
  • anivas  · 技术社区  · 14 年前

    我有一个hierarchy collection对象,我试图在其中检索Linq中最后一级对象的属性。我不想为每个属性编写get方法。不知道如何通过选择器实现

    Class Test {
        public int ID { get; set; }
        public int PopertyA { get; set; }
        public string PopertyB { get; set; }
                  ...Many more properties
    
    }
    
    public static TResult GetTest(hierarchyObject, int ID, Func<TSource, TResult> selector)
    {
        return (from level1 in hierarchyObject.Level1
                from test in level1.Test
                where test.ID.Equals(ID)
                select selector).First();
    }
    

    编辑:

    Class Hierarcy{
      public IList<Level1> level1;
    }
    
    Class Level1 {
    public IList<Test> test;
    }
    

    3 回复  |  直到 14 年前
        1
  •  1
  •   vgru    14 年前

    这取决于你想怎么处理你的财产。为了避免对您感兴趣的每个属性重复整个LINQ查询,最好先获取测试对象,然后检查其各个属性:

    class Hierarcy
    {
       public IList<Level1> Level1;
       public Test GetTest(int ID)
       {
           return this
              .Level1
              .SelectMany(level => level.Test)
              .Where(test => test.ID == ID)
              .First();
       }
    }
    

    Test 类的所有属性:

    Test t = myHierarchy.GetTest(someId);
    
    // do something
    int i = test.PropertyA;
    string s = text.PropertyB;
    

    如果您对动态获取属性的值感兴趣(仅使用其名称),则可以使用反射来执行此操作:

    Test t = myHierarchy.GetTest(someId);
    
    // this will print all properties and their values
    foreach (PropertyInfo pi in t.GetType().GetProperties())
    {
        Console.WriteLine("Name:{0}, Value:{1}",
           pi.Name,
           pi.GetValue(pi, null));
    }
    

        2
  •  1
  •   Niki    14 年前

    我想你可能想要这样的东西:

    public static TResult GetTest(hierarchyObject, int ID, Func<Test, TResult> selector)
    {
        return (from level1 in hierarchyObject.Level1
                from test in level1.Test
                where test.ID.Equals(ID)
                select selector(test)).First();
    }
    
        3
  •  0
  •   Euphoric    14 年前

    hiearchyObject.Level1.SelectMany(x=>x.Test).Where(test=>test.ID.Equals(ID)).Select(selector).First();
    

    现在没有电脑来测试。

    public static TResult GetTest<TResult> (.. , Func<Test, TResult> selector)