我正试图在大型代码库中找到特定类型(例如Widget)的所有成员字段(但不是局部变量)。
我正在使用VS2005,但不介意非vs解决方案。
如果我使用C ++,我可以将搜索限制为头文件,但这在c#中不起作用
我可以搜索“Widget m_”,但这可能会遗漏那些未正确命名的字段。
还有其他想法吗?
更多信息:
我的WidgetManager中有一个确定的小部件列表。任何其他类都可以有一个指向Widget的指针。如果我从我的WidgetManager中删除一个Widget,我希望将该小部件的所有其他指针(无论它们在解决方案中的哪个位置)设置为null。
从我的WidgetManager中删除Widget时会引发“已毁坏”事件。我想在所有存储对Widgets的引用的类中捕获该事件,并在删除Widgets时将它们的引用设置为null。我原来问题的关键是验证我找到了所有参考文献。
如果有人能想到更好的方式,请告诉我。
答案 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中不存在。最接近的功能是“查找所有引用”,但这将包括您已经说过要排除的本地变量引用。
一旦找到这些字段,您能告诉我们您想要做些什么吗?如果它只是用于计数,则可以使用反射来查找所有字段并获得准确的计数。如果它涉及更多涉及源更改的内容,则可能必须使用各种解析器。