鉴于此类
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
属性是对象还是对象列表?这可能吗?
答案 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的类/结构的代码。
干杯,
基思