使用名为XYZ的属性获取程序集中的所有类型

时间:2016-04-26 07:58:55

标签: c# reflection

我希望获得某些已声明具有特定名称的属性的程序集中的所有类型:

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

但我不知道是否有更好的方法来获取所有类型和每个搜索所有属性,并查看是否有任何命名为输入刺痛。

2 个答案:

答案 0 :(得分:1)

没有比迭代所有类型更好的方法,并检查每个类型中的所有类型。

您可以使用以下内容:

foreach (Type t in typeof(MyAssembly).Assembly.GetTypes())
{
    PropertyInfo p = t.GetProperty("XYZ");

    if (p != null)
    { ... }
}

当然,如果可能的话,最好创建一个匹配的接口,但是如果你无法控制程序集中的代码,那么这是你唯一的解决方案。

答案 1 :(得分:0)

理论上,它甚至更复杂。问题是CLR允许多个属性具有相同的名称,只要它们具有不同的参数(仅适用于C#不支持的索引属性,但索引器除外)。

因此,您通常甚至必须遍历给定类型的所有属性,并查看是否至少有一个具有您的名称且可能没有参数。

然而,这是一个极端情况,您可能只想忽略它,我只是想让您知道如果不考虑索引属性可能会出现的一些异常。

因此,如果您有机会影响您想要使用的程序集,那么最好使用已经在评论中指明的界面。