获取C#中方法的总行数

时间:2015-07-17 08:32:03

标签: c# c#-4.0 methodinfo

我需要从特定方法获取总行数。 我有以下代码:

 MethodInfo[] methodInfos = typelist[i].GetMethods();
 from methodInfos[0]

我怎样才能得到它?

3 个答案:

答案 0 :(得分:3)

无法做到,例如这些方法将编译成相同的 IL代码

// One line 
public static void Sample() {
  Console.Write("abc"); Console.Write("def");
}

// Two lines 
public static void Sample() {
  Console.Write("abc"); 
  Console.Write("def");
}

// Three lines 
public static void Sample() {
  Console.Write("abc"); 
  // Some comment
  Console.Write("def");
}

答案 1 :(得分:1)

MethodInfo是.NET反射的一部分。这将为您提供有关.NET类型模型的任何信息。不幸的是(?!?)代码行的数量属于该信息。类型模型独立于您选择编写方法的语言。如果您想知道代码行的数量,则必须采用不同的方法。 (ReSharper插件或rosalyn)

答案 2 :(得分:1)

警告:不建议这样做,我只是用狡猾/狡猾的方式模拟它!

您可以抛出2个异常并获取行。

我在下面写了一些(棘手的)代码:

public class Program
{
    private static int first = 0, second = 0;
    private static void Log(Exception ex, bool last = false)
    {
        var st = new StackTrace(ex, true);
        var frame = st.GetFrame(0);
        if(last)
        {
            second = frame.GetFileLineNumber();
            Console.WriteLine("Total lines: {0}", second - first);
        }
        else
        {
            first = frame.GetFileLineNumber();
        }
    }

    private static void Test()
    {
        try { throw new Exception("Ex1"); } catch(Exception ex) { Log(ex); }

        int a = 5;
        string b = "text";
        bool c = false;

        try { throw new Exception("Ex2"); }catch(Exception ex) { Log(ex, true); }
    }

    private static void Main()
    {
        Test();
        Console.ReadLine();
    }
}

所以,它只是获取异常行号并减去​​它们,我们有行数!

编辑另外,我认为它不会总是如此,因为编译器会做一些优化,JIT也是等等。(我几乎不记得这个过程对不起)它可能是不可能的但这很接近。