【问题标题】:Auto detect the type of reference property of a given class object自动检测给定类对象的引用属性类型
【发布时间】:2015-11-13 06:05:36
【问题描述】:

给定这样的课程

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 属性是对象还是对象列表?这可能吗?

【问题讨论】:

  • EmployeeCard,没有看到它的类定义,看起来是一个单一的对象。您不能将数组分配给包含单个对象的数组,因此您不需要在运行时检查它。怎么可能包含一个列表或单个对象?
  • 罗恩完全正确。如果是列表,则类型为 IList 等。强类型语言的好处之一是能够一目了然地看到此类信息。
  • 嗯。它怎么可能成为一个列表?它被定义为单个对象 ....
  • 我在运行时需要它不是为它分配一个数组,而是根据类型和关系创建未知对象类型(可能是Employee,EmployeeCard,......)的动态报告在我需要生成报告的类之间

标签: c# reflection properties


【解决方案1】:

查看属性的类型是否实现IEnumerable

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

这应该适用于所有通用和非通用集合类型,包括IList&lt;T&gt;

【讨论】:

  • 如果属性是对象列表还是对象,这会给我吗??
  • 就像答案说的那样,是的,因为IList&lt;T&gt; 实现了IEnumerable
【解决方案2】:

据我所知,您在示例中指的是这行代码: 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 的类/结构的代码。

干杯,

基思

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-30
    • 1970-01-01
    • 2020-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多