c#类中的Iterator方法,以查看是否正在调用方法

时间:2011-03-10 16:59:34

标签: c# class

基本问题是如何确定某个类的每个方法中是否包含某个字符串?

我们要求某个类中的所有方法都进行日志记录调用。我想迭代这个类中的方法,看看每个方法是否正在进行此调用。我知道我可以使用反射来迭代类中的方法,但是如何在每个方法中获取代码以便我可以执行IndexOf()?

好的,还有一些信息。 只有某些方法需要调用记录器(由我确定)我们希望能够确保所有方法都调用记录器,将已调用的记录器注释掉,以便我们可以运行程序并确定新方法有哪些添加了没有记录器调用或注释掉记录器调用。每个月一个小组将确定一种方法是否值得记录。 我只是试图想出一种自动方式来显示已经或者没有解决过日志记录的所有方法。

4 个答案:

答案 0 :(得分:2)

您可能需要查看Post Sharp - http://www.sharpcrafters.com/postsharp - 或其他一些面向方面的编程框架。这将允许您将日志记录附加到方法一次,而不必在每个方法中执行。

答案 1 :(得分:1)

您可能不希望从头开始编写所有代码作为独立程序。对于类似的检查,您应该只为FxCop/Code Analysis tools编写自定义规则。这会更容易,而且你可以使用基础设施,比如自动检查提交等。

答案 2 :(得分:0)

要使用反射获取类中的所有公共实例方法,只需执行:

MethodInfo[] minfos = typeof(MyType).GetMethods();
foreach (MethodInfo mi in minfos)
{
   Console.WriteLine("Public instance method: " + mi.Name);
}

如果您还需要获取静态或私有方法,则需要使用其他GetMethods重载,如下所示:

MethodInfo[] minfos = typeof(ConfigurationItemType).GetMethods(
   BindingFlags.Static | BindingFlags.Instance | 
   BindingFlags.NonPublic | BindingFlags.Public);

答案 3 :(得分:0)

编辑 ActiveSharp似乎正在以编程方式执行您需要的操作。 检查this page上的“在运行时检查MSIL(FxCop的轻量级替代品)”下的示例

System.Reflection.MethodInfo methodToLookAt = ....; // obtain this via normal reflection, e.g. Type.GetMethod

ActiveSharp.Inspection.MethodInspector ins = new MethodInspector(methodToLookAt, false);

// what are all the methods that it (directly) calls?
IEnumerable<MethodBase> callees = ins.AllCalledMethods;

如果您想以艰难的方式去做并尝试通过反射检查CIL,您可以尝试阅读this article