有没有一种方法可以识别一个给定的类是否引用了另一个类



我可以通过反射来处理层次结构,是的,但这很有挑战性,因为元素是多样的。因此:

class A
{
string Hello;
}
class B
{
List<A> Hellos;
}
class E
{
A OtherRandomness;
}
class D:B
{
E randomthing;
}
class C:D
{
string OtherThing;
}

我有一个C类型的对象,我希望能够找到并识别它有一个a对象的列表,然后处理它们。

当然,现实生活中的例子比这更复杂,但原理是一样的。我尝试过对属性进行递归循环,但我很难找到处理a(不尝试处理字符串和int对象以及b(识别属性类似于X的可枚举对象的方法

如果有人能提出一个简单明了的方法,我们将不胜感激。我需要能够在一系列的地方做到这一点,所以我必须能够从任何类类型开始。

所以我从x的类型开始。在这种情况下,x是C,但x可以很容易地是Z,没有到类型a的链接。

此外,这需要判断我是否有D班。我希望能够接上地狱和随机的东西。

我假设这些是公共实例属性。如果你想要其他东西,你可以调整BindingFlags

我的解决方案的想法是测试属性的类型是否为泛型。如果是,则测试其中一个类型参数是否为typeof(A)。但是,它不测试像List<List<A>>这样的嵌套泛型类型。这需要一种递归方法。

var props = typeof(C).GetProperties(BindingFlags.Instance | BindingFlags.Public)
.Where(p => p.PropertyType.IsGenericType &&
p.PropertyType.GenericTypeArguments.Any(t => t == typeof(A)));
foreach (var prop in props) {
Console.WriteLine(prop);
}

打印:

System.Collections.Generic.List`1[MyNamespace.A]Hellos


更具体地测试使用这种类型层次结构的A的枚举:

class A
{
public string Hello { get; set; }
}
class AA : A
{
}
class B
{
public List<A> Hellos { get; set; }
public List<AA> AAHellos { get; set; }
}
class D : B
{
public A randomthing { get; set; }
}
class C : D
{
public string OtherThing { get; set; }
}

测试:

var c = new C {
Hellos = new List<A> {
new A { Hello = "Hello" },
new A { Hello = "World" }
},
AAHellos = new List<AA> {
new AA { Hello = "Hello" },
new AA { Hello = "World AA" }
}
};
var enumerableOfA = typeof(IEnumerable<A>);
var props = c.GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public)
.Where(p => enumerableOfA.IsAssignableFrom(p.PropertyType));
foreach (var prop in props) {
Console.WriteLine(prop);
var list = (IEnumerable<A>)prop.GetValue(c);
foreach (var item in list) {
Console.WriteLine(item.Hello);
}
}

打印:

System.Collections.Generic.List`1[MyNamespace.A]Hello
你好
世界
System.Collections.Generic.List` 1[MyNimespace.AA]AAHello

这也会返回AA的列表,这可能会令人惊讶。发生这种情况的原因是接口IEnumerable<out T>声明中的out关键字使其协变。

然而,这将不包括例如Dictionary<int,A>,因为字典实现IEnumerable<KeyValuePair<int,A>>。我的第一个解决方案将返回这样一个属性,但接下来需要做更多的工作来获取字典条目。

相关内容

最新更新