自动检测给定 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 的代码。
干杯,
基思
给定一个 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 的代码。
干杯,
基思