【发布时间】:2019-12-11 03:40:03
【问题描述】:
我需要使用反射来过滤掉所有作为集合的对象属性。它们并不总是通用列表,而是一个继承 List<T> 类型的类。例如,我有一个类foo,其属性类型为fooCollection。 FooColection 如下所示:
public class foo
{
public FooCollection myCollection {get;set;}
}
public class fooCollection : List<Foo>
{
}
我不知道List<T> 的类型是什么,但只需要知道它是否是一个集合。我怎样才能找到这个?我问了一个先前的问题,但措辞不同,结果不适用于我的特定实例。
我尝试了以下示例,我查看了foo 的所有属性,并尝试找到fooColelction 的属性:
typeof(IEnumerable<>).IsAssignableFrom(prop.PropertyType)
但这对我来说不能正常工作。类型不是IEnumerable,尽管它是一个集合。它继承了IEnumerable 类型。
这是一个名为 Policy 的类对象的 Collection 类之一的示例。
public class PolicyCollection : List<Policy>
{
/// <summary>
/// This function takes a xml Policy collection and builds a PolicyCollection Class
/// </summary>
/// <param name="xDocPolicyCollection">XML Document of an PolicyCollection</param>
protected internal void LoadXml(XmlDocument xDocPolicyCollection)
{
foreach (XmlNode n in xDocPolicyCollection.GetElementsByTagName("Policy"))
{
XmlDocument xdoc = new XmlDocument();
xdoc.LoadXml(n.OuterXml);
Policy p = new Policy();
p.LoadXml(xdoc);
Add(p);
}
}
/// <summary>
/// This function takes a datatable of Policies collection and builds a PolicyCollection Class
/// </summary>
/// <param name="dtContact">Data</param>
protected internal void LoadDB(DataTable dtPolicyCollection)
{
foreach (DataRow dr in dtPolicyCollection.Rows)
{
Policy p = new Policy();
p.LoadDB(dr);
Add(p);
}
}
}
这与之前的问题不同,因为我要问的是如何检查这种情况下的属性类型是常规类,继承 List<T>,而不是 List<T> 的属性。
【问题讨论】:
-
能否包含
FooCollection类代码? -
是的,一会儿。我将举一个一般的例子来演示。现在,显然这个例子不是 Foo 和 fooCollection,而是针对 Policy 和 PolicyCollection。
-
为什么需要知道类型是否为列表?这可能是一个 XY 问题。您要解决的实际问题是什么?
-
@CodeCaster 但是再次检查
IList会起作用。我认为 OP 不需要泛型类型参数。 -
就像@Luaan 说的那样,这说明了 XY 问题。一般来说,您不应该从
List<T>继承,当然也不应该在单元测试中求助于反射。
标签: c# .net reflection types