在C#中查找特定类型的成员字段

时间:2009-04-20 14:14:11

标签: c#

我正试图在大型代码库中找到特定类型(例如Widget)的所有成员字段(但不是局部变量)。

我正在使用VS2005,但不介意非vs解决方案。

如果我使用C ++,我可以将搜索限制为头文件,但这在c#中不起作用

我可以搜索“Widget m_”,但这可能会遗漏那些未正确命名的字段。

还有其他想法吗?


更多信息:

我的WidgetManager中有一个确定的小部件列表。任何其他类都可以有一个指向Widget的指针。如果我从我的WidgetManager中删除一个Widget,我希望将该小部件的所有其他指针(无论它们在解决方案中的哪个位置)设置为null。

从我的WidgetManager中删除Widget时会引发“已毁坏”事件。我想在所有存储对Widgets的引用的类中捕获该事件,并在删除Widgets时将它们的引用设置为null。我原来问题的关键是验证我找到了所有参考文献。

如果有人能想到更好的方式,请告诉我。

4 个答案:

答案 0 :(得分:2)

使用反射来检查已编译的dll。迭代所有类型并找到引用该类型的所有属性..

修改

这是一个示例,它查找在当前应用程序域中公开字符串的所有属性。

public static void Main(string[] args)
{
    printAllPublicPropertiesInCurrentAppDomain(typeof(string));
}

private static void printAllPublicPropertiesInCurrentAppDomain(Type typeToFind)
{
    foreach (Assembly assembly in AppDomain.CurrentDomain.GetAssemblies())
    {
        foreach (Type type in assembly.GetTypes())
        {
            foreach (PropertyInfo info in type.GetProperties())
            {
                if (info.PropertyType == typeToFind)
                {
                    Console.WriteLine("Assembly: {0}, Type: {1}, Property: {2}", assembly.GetName().Name, type.Name, info.Name);
                }
            }
        }
    }
}

编辑2

我不确定默认情况下GetProperties返回什么,但它确实有一个允许你指定BindingFlags的重载。您可以指定:

type.GetProperties(BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic)

用于所有公共或私有实例和静态属性。

答案 1 :(得分:0)

代码库是一个解决方案吗?如果是,请转到该类型,右键单击类型的名称,然后选择“查找所有引用”。

答案 2 :(得分:0)

我想利用现有的编译器,因为否则你必须至少实现C#解析器的一个子集才能获得合理可靠的答案。另外,就个人而言,我想避免加载所涉及的组件并使用Reflection,因为这可能会导致副作用。

NDepend提供Code Query Language,可让您回答这个问题以及更复杂的问题。不是免费的,但很好。

我认为Cecil可以用于编译程序集,而且工作量更大。

答案 3 :(得分:0)

您正在寻找的功能在VS 2005中不存在。最接近的功能是“查找所有引用”,但这将包括您已经说过要排除的本地变量引用。

一旦找到这些字段,您能告诉我们您想要做些什么吗?如果它只是用于计数,则可以使用反射来查找所有字段并获得准确的计数。如果它涉及更多涉及源更改的内容,则可能必须使用各种解析器。