【问题标题】:How to get properties of a class which are IEnumerable of a class or an IEnumerable of a class inherited from that class [duplicate]如何获取类的 IEnumerable 类的属性或从该类继承的类的 IEnumerable [重复]
【发布时间】:2021-10-25 03:03:59
【问题描述】:

在 c# 中,我有一个带有属性的类,它返回 IEnumerables。

public class MyClass
{
   public IEnumerable<MyPropClass1> Prop1 { get { return _prop1; } }
   public IEnumerable<MyPropClass2> Prop2 { get { return _prop2; } }
   public IEnumerable<AnotherClassAltogether> Prop3 {get {return _prop3; } }
   ...
}

假设 MyPropClass1 和 MyPropClass2 都从 MyPropBaseClass 继承,但 AnotherClassAltogether 没有。

从 MyClass 获取所有属性的最简单方法是什么,这些属性要么是某个类的 IEnumerable,要么是从该类继承的某个类的 IEnumerable?

例如如果我想在 MyClass 中查询基于 IEnumerables 的属性,模板化为基于 MyPropBaseClass 的东西,那么它应该返回 Prop1 和 Prop2

为了更清楚(希望解决近距离投票),回答这个问题的伪函数将类似于:

var properties = GetIEnumerablePropertiesOfType(typeof(MyClass), typeof(MyPropBaseClass))

这将返回包含 Prop1 和 Prop2 的属性列表(作为 System.Reflection.PropertyInfo 的枚举)

【问题讨论】:

    标签: c# reflection


    【解决方案1】:
    using System;
    using System.Reflection;    
    using System.Linq;
    using System.Collections;
    using System.Collections.Generic;
    
    public class Program
    {
        public class MyPropClass{}
        public class MyPropClass1 : MyPropClass{}
        public class MyPropClass2 : MyPropClass{}
        public class AnotherClassAltogether {}
    
        public class MyClass
        {
             public object Prop_Wrong { get; set; }
             public IEnumerable Prop_Wrong_IEnumerable { get; set; }
             public IEnumerable<MyPropClass1> Prop1 { get; set; }
             public IEnumerable<MyPropClass2> Prop2 { get; set; } 
             public IEnumerable<AnotherClassAltogether> Prop3 {get; set; }
        }
    
        public static IEnumerable<PropertyInfo> GetIEnumerablePropertiesOfType(Type targetType, Type lookFor)
        {
            return targetType.GetProperties(BindingFlags.Public | BindingFlags.Instance)
                .Where(x => x.PropertyType.IsGenericType
                         && x.PropertyType.GetGenericTypeDefinition() == typeof(IEnumerable<>)
                         && x.PropertyType.GenericTypeArguments.Single().IsAssignableTo(lookFor));
        }
    
        public static void Main()
        {
            foreach (var item in GetIEnumerablePropertiesOfType(typeof(MyClass), typeof(MyPropClass)))
            {
                Console.WriteLine($"Property {item.Name} of type {item.PropertyType}");
            }
        }
    }
    

    【讨论】:

    • 我不建议中继类型名称。另外我认为此代码对于非通用 IEnumerable 将失败
    • 查看编辑。问题未提及System.Collections.IEnumerable
    猜你喜欢
    • 2018-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多