C#打印一个代表

时间:2009-10-15 13:31:44

标签: c# reflection delegates

是否有一种在运行时打印委托代码的简单方法? (“包含一种方法”)。

public delegate void SimpleDelegate();

SimpleDelegate delegateInstance = 
           delegate { DoSomeStuff(); int i = DoOtherStuff() };

现在,我想在屏幕上显示delegateInstance的主体。也就是说,做像反射器这样的事情。我可以这样做吗?也许我可以使用一些.pdb文件?

3 个答案:

答案 0 :(得分:4)

请注意,在某些情况下,您可以使用lambdas执行 这一操作,方法是将它们编译为Expression树而不是委托(是作弊,但可能足以帮助):

    Expression<Func<char, int, string>> func
        = (c, i) => new string(c, i);
    Console.WriteLine(func); // writes: (c, i) => new String(c, i)
    var del = func.Compile();
    string s = del('a', 5);
    Console.WriteLine(s); // writes: aaaaa

请注意,.NET 4.0表达式树可以根据原始问题封装语句体(在this article末尾讨论) - 但C#编译器不支持将C#代码编译为此类表达式(您需要这很难做到。)

答案 1 :(得分:3)

你可以打印IL,就是这样。可能在.NET Reflector中有一些可重用的组件可用于将IL转换回C#或VB.NET。

PDB文件包含行号,非公共类/结构/方法,变量名。如果你手头有原始的C#源代码,你可以尝试通过PDB文件中的行号映射来获取代码。

答案 2 :(得分:0)

我不相信有一种简单的方法可以实现这一目标。 Reflector或其他一些反编译器可以向您显示程序的来源。据我所知,PDB只将操作码映射到程序源中的行。它不包括来源。

我已经使用 StackTrace 类以及PDB和源来找出异常的来源。