Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 打印一个代表_C#_Reflection_Delegates - Fatal编程技术网

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