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

时间:2015-08-19 19:24:22

标签: c# reflection properties

鉴于此类

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; }
}

如果我有上述类的对象,如何在运行时确定EmployeeCard属性是对象还是对象列表?这可能吗?

2 个答案:

答案 0 :(得分:1)

检查属性的类型是否实现?- digits10plusdigit100_n(Zs,1). Zs = [1] ; Zs = [2] ; Zs = [3] ... ; Zs = [98] ; Zs = [99] ; false. ?- digits10plusdigit100_n(Zs,3). Zs = [1,1,1] ; Zs = [1,1,2] ; Zs = [1,1,3] ... ; Zs = [1,2,1] ; Zs = [1,2,2] ... ; Zs = [1,9,8] ; Zs = [1,9,9] ; Zs = [2,1,1] ; Zs = [2,1,2] ... ; Zs = [2,1,3] ; Zs = [2,1,4] ... ; Zs = [98,9,9] ; Zs = [99,1,1] ; Zs = [99,1,2] ... ; Zs = [99,9,8] ; Zs = [99,9,9] ; false.

IEnumerable

这适用于所有通用和非通用集合类型,包括bool isCollection = typeof(Employee).GetProperty("EmployeeCard") .PropertyType .GetInterface("IEnumerable") != null;

答案 1 :(得分:0)

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

首先我应该指出,在方法名称和类/结构名称上使用相同的情况并不是一种好的做法,在某些情况下可能会导致编译器出现问题。其次,据我所知,由于你将它设置为返回单个对象(EmployeeCard),你不能让这个方法的非虚拟版本返回该类型的数组。我建议您继续并始终返回一个数组,然后检查数组的长度,如下所示:

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
}

我还没有测试过这段代码,因为我在工作,但我觉得这里有足够的东西让你可以理解。希望我没有误解你在这里尝试做什么,而且我不得不假设一些事情,因为你没有发布名为EmployeeCard的类/结构的代码。

干杯,

基思