是否有一种在运行时打印委托代码的简单方法? (“包含一种方法”)。
public delegate void SimpleDelegate();
SimpleDelegate delegateInstance =
delegate { DoSomeStuff(); int i = DoOtherStuff() };
现在,我想在屏幕上显示delegateInstance的主体。也就是说,做像反射器这样的事情。我可以这样做吗?也许我可以使用一些.pdb文件?
答案 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和源来找出异常的来源。