我希望获得某些已声明具有特定名称的属性的程序集中的所有类型:
public class DocumentiDiIdentitaList {
public static void main(String[] args) {
Field[] fields = DocumentiDiIdentita.class.getDeclaredFields();
Arrays.stream(fields).forEach(f -> {
try {
System.out.println(f.get(null));
}
catch (IllegalAccessException e) {}
});
}
}
请注意,这些类不是从实现public class Car
{
public WheelInfo WHEEL { get; set; }
}
public class Plane
{
public WheelInfo WHEEL { get; set; }
}
的相同基类派生的,但实际上这些类恰好具有相同的名称。
在C#中使用反射的正确方法是什么?程序集中有200多个类将被搜索。
现在我可以检查ABC类型是否具有以这种方式声明的属性XYZ:
WHEEL
但我不知道是否有更好的方法来获取所有类型和每个搜索所有属性,并查看是否有任何命名为输入刺痛。
答案 0 :(得分:1)
没有比迭代所有类型更好的方法,并检查每个类型中的所有类型。
您可以使用以下内容:
foreach (Type t in typeof(MyAssembly).Assembly.GetTypes())
{
PropertyInfo p = t.GetProperty("XYZ");
if (p != null)
{ ... }
}
当然,如果可能的话,最好创建一个匹配的接口,但是如果你无法控制程序集中的代码,那么这是你唯一的解决方案。
答案 1 :(得分:0)
理论上,它甚至更复杂。问题是CLR允许多个属性具有相同的名称,只要它们具有不同的参数(仅适用于C#不支持的索引属性,但索引器除外)。
因此,您通常甚至必须遍历给定类型的所有属性,并查看是否至少有一个具有您的名称且可能没有参数。
然而,这是一个极端情况,您可能只想忽略它,我只是想让您知道如果不考虑索引属性可能会出现的一些异常。
因此,如果您有机会影响您想要使用的程序集,那么最好使用已经在评论中指明的界面。