无异常地获取当前方法和类,并且不在C#中使用反射

时间:2018-01-26 11:33:51

标签: c# .net

我想在方法中注销一些INFO日志记录,我不想使用反射来获取类和方法名称。

对于错误记录,我可以从异常中获取堆栈但是如何在没有异常的情况下执行此操作以关闭StackTrace?

3 个答案:

答案 0 :(得分:8)

您可以使用caller attributes

获取有关来电者的信息
public void Log(Exception ex, [CallerFilePath]string callerFilePath = null, [CallerMemberName]string callerMemberName = null, [CallerLineNumber]int callerLineNumber = 0)
{
    Console.WriteLine($"Message: {ex.Message} # File: {callerFilePath} # Line: {callerLineNumber} # Member: {callerMemberName}"  );
}

当调用该方法时,编译器会将有关调用者的信息传递给您,您无需手动指定参数。

答案 1 :(得分:3)

使用反射获取此数据相当昂贵。

|               Method |          Mean |      Error |     StdDev |
|--------------------- |--------------:|-----------:|-----------:|
| MethodNameReflection | 1,452.4709 ns | 24.5287 ns | 50.6561 ns |
|     MethodNameNameOf |     0.0543 ns |  0.0521 ns |  0.0678 ns |
|             TypeName |    14.4099 ns |  0.3964 ns |  0.7543 ns |
|   TypeNameReflection | 1,659.5866 ns | 33.1575 ns | 90.7682 ns |

和代码(使用BenchmarkDotNet)

public class CurrentMethodInfoBenchmarks
{
    [Benchmark]
    public string MethodNameReflection() => MethodBase.GetCurrentMethod().Name;

    [Benchmark]
    public string MethodNameNameOf() => nameof(MethodNameNameOf);

    [Benchmark]
    public string TypeName() => GetType().Name;

    [Benchmark]
    public string TypeNameReflection() => MethodBase.GetCurrentMethod().DeclaringType.Name;
}

使用CallerMemberAttributes也应该像nameof()一样快,它将是编译时常量。

答案 2 :(得分:0)

您可以使用System.Environment.StackTrace属性