自动检测给定 class 对象的引用类型 属性

Auto detect the type of reference property of a given class object

给定一个 class 这样的

public class Employee
{
   public Employee()
   {
       Children = new List<Child>();
   }
   public virtual string FirstName { get; set; }
   public virtual string LastName { get; set; }
   public virtual EmployeeCard EmployeeCard { get; set; }
   public virtual IList<Child> Children { get; protected set; }
}

如果我有上面class的对象,如何在运行时判断EmployeeCard属性是对象还是对象列表?这可能吗?

检查 属性 的类型是否实现 IEnumerable:

bool isCollection = 
   typeof(Employee).GetProperty("EmployeeCard")
                   .PropertyType
                   .GetInterface("IEnumerable")
     != null;

这应该适用于所有通用和非通用集合类型,包括 IList<T>

据我所知,您在示例中指的是这行代码: public virtual EmployeeCard EmployeeCard{ get; set; }

首先我应该指出,在您的方法名称和 class/struct 名称中使用相同的大小写不是好的做法,在某些情况下可能会导致您的编译器出现问题。其次,据我所知,由于您已将其设置为 return 单个对象 (EmployeeCard),因此您无法将此方法的非虚拟版本 return 设为该类型的数组。我推荐的是,你总是 return 一个数组,然后检查数组的长度,像这样:

public virtual EmployeeCard[] _EmployeeCard { get; set; }

并使用 :

声明您的覆盖
private EmployeeCard[] _employeeCards;

public override EmployeeCard[] _EmployeeCard
{
    get{
        return _employeeCards;
    }
    set{
        _employeeCards = (EmployeeCard[])value;
    }
}

当你引用它时,想知道它们是否超过 1 个,你可以这样做:

if(myEmployee._EmployeeCard.Length > 1)
{
    Console.WriteLine(string.Format("Employee has {0} cards.", myEmployee._EmployeeCard
}

我还没有测试这段代码,因为我在工作,但我认为这里有足够的东西可以让你理解这个想法。希望我没有误解您在这里实际尝试做的事情,并且我不得不假设一些事情,因为您没有 post 您的 class/struct 名为 EmployeeCard 的代码。

干杯,

基思