C# 打印一个代表
是否有一种在运行时打印委托代码的简单方法?(即“包含一种方法”)C# 打印一个代表,c#,reflection,delegates,C#,Reflection,Delegates,是否有一种在运行时打印委托代码的简单方法?(即“包含一种方法”) 现在,我想在屏幕上显示delegateInstance的主体。也就是说,做一些类似反射器的事情。我能做这个吗?也许我可以使用一些.pdb文件?你可以打印IL,就这样。在.NET Reflector中可能有一些可重用的组件,您可以使用它们将IL转换回C#或VB.NET PDB文件包含行号、非公共类/结构/方法、变量名。如果您手头有原始C#源代码,您可以尝试通过在PDB文件中使用行号进行映射来获取代码。我认为没有简单的方法来实现这一点
现在,我想在屏幕上显示delegateInstance的主体。也就是说,做一些类似反射器的事情。我能做这个吗?也许我可以使用一些.pdb文件?你可以打印IL,就这样。在.NET Reflector中可能有一些可重用的组件,您可以使用它们将IL转换回C#或VB.NET
PDB文件包含行号、非公共类/结构/方法、变量名。如果您手头有原始C#源代码,您可以尝试通过在PDB文件中使用行号进行映射来获取代码。我认为没有简单的方法来实现这一点。Reflector或其他反编译器可以向您显示程序的源代码。据我所知,PDB只将操作码映射到程序源代码中的行。它不包括来源
我使用了StackTrace类以及PDB和源代码来查找异常的来源。注意,在某些情况下,您可以使用lambdas执行类似的操作,方法是将它们编译为
表达式
树,而不是委托(这是作弊,但可能足以起到帮助作用):
表达式函数
=(c,i)=>新字符串(c,i);
Console.WriteLine(func);//writes:(c,i)=>新字符串(c,i)
var del=func.Compile();
字符串s=del('a',5);
Console.WriteLine(s);//写入:aaaaa
请注意,.NET 4.0表达式树可以按照原始问题(在结尾处讨论)封装语句体,但C#编译器不支持将C#代码编译为此类表达式(您需要以艰难的方式来完成)。I so,so,so,so,so,所以希望C#4编译器充分利用新表达式树的强大功能:(在3.5中是这样;在4.0中不是这样——但我知道你的意思。
public delegate void SimpleDelegate();
SimpleDelegate delegateInstance =
delegate { DoSomeStuff(); int i = DoOtherStuff() };
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