相关疑难解决方法(0)

如何从代码中获取当前方法的名称

我知道你能做到

this.GetType().FullName
Run Code Online (Sandbox Code Playgroud)

要得到

My.Current.Class
Run Code Online (Sandbox Code Playgroud)

但是我能得到什么呢

My.Current.Class.CurrentMethod
Run Code Online (Sandbox Code Playgroud)

c# introspection

356
推荐指数
7
解决办法
31万
查看次数

你能用反射来找到当前正在执行的方法的名称吗?

就像标题所说:反射可以为您提供当前正在执行的方法的名称.

由于海森堡的问题,我倾向于不猜.如何在不改变当前方法的情况下调用一种方法来告诉您当前的方法?但是我希望有人可以在那里证明我的错.

更新:

  • 第2部分:这可以用来查看属性的内部代码吗?
  • 第3部分:性能如何?

最终结果
我了解了MethodBase.GetCurrentMethod().我还了解到,我不仅可以创建堆栈跟踪,而且如果需要,我只能创建我需要的确切帧.

要在属性中使用它,只需使用.Substring(4)删除'set_'或'get_'.

.net reflection

198
推荐指数
10
解决办法
6万
查看次数

从异步函数中获取当前方法名称?

无论如何从异步函数中获取当前方法名称?

我试过了:

System.Reflection.MethodInfo.GetCurrentMethod();
Run Code Online (Sandbox Code Playgroud)

我尝试使用StackTrace和StrackFrame如下:

StackTrace strackTrace = new StackTrace();

for (int i = 0; i < strackTrace.GetFrames().Length; i++)
{
    SafeNativeMethods.EtwTraceInfo("Function" + i + ":" + function);
    SafeNativeMethods.EtwTraceInfo("Type" + i + ":" + strackTrace.GetFrame(i).GetType().Name);
    SafeNativeMethods.EtwTraceInfo("Method" + i + ":" + strackTrace.GetFrame(i).GetMethod().Name);
    SafeNativeMethods.EtwTraceInfo("ToString Call" + i + ":" + strackTrace.GetFrame(i).ToString());
}
Run Code Online (Sandbox Code Playgroud)

但它们似乎都不起作用,我会得到".ctor","InvokeMethod","Invoke","CreateInstance","CreateKnownObject"或"CreateUnknownObject"或"MoveNext"

有关如何做到这一点的任何想法?我想创建一个通用的记录器函数,我不想传入调用记录器函数的函数的名称,所以我尝试了stacktrace方法,没有用.

我放弃了,并说,好吧,我将传递函数名称作为第一个参数,但是当我从调用通用记录器函数的调用函数调用反射方法时,我总是得到".ctor"

有任何想法吗?注意我正在调用的通用记录器函数是同一个类中的静态方法(现在必须以这种方式...).

c# async-await

21
推荐指数
5
解决办法
6411
查看次数

MoveNext而不是实际的方法/任务名称

使用log4net声明为:

private readonly ILog log = 
       LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType());
Run Code Online (Sandbox Code Playgroud)

在异步方法或任务中,如下所示:

public async void CheckSomething()
{
    log.Info(null);
    //....
}
Run Code Online (Sandbox Code Playgroud)

日志MoveNext而不是CheckSomething.知道如何让它记录一个实际的方法名称?

c# log4net methodbase async-await

19
推荐指数
5
解决办法
9796
查看次数

获取引发异常的方法名称

我知道.类似的问题已经提出过了.

但我还没有得到确切的解决方案.

我有一个按钮点击事件,我有一个方法FillCombo().

按钮单击事件

private void button1_Click(object sender, EventArgs e)
{
      try
      {
          cmbTemplates.Items.Clear();
          lstFiles.Clear();
          FillCombo();                
      }
      catch (Exception ex)
      {
           MethodBase site = ex.TargetSite;
           Log(ex.ToString(), site == null ? null : site.Name);                
      }
}
Run Code Online (Sandbox Code Playgroud)

当我调试时,我发现异常发生在FillCombo()方法中.在那之后,我得到的值site.Name作为WinIOError代替FillCombo.

我尝试了另一种方法GetExecutingMethodName(),由Chris Gessler如何获取导致异常问题的方法的名称中回答.所以我尝试使用GetExecutingMethodName()方法发送导致异常的方法名称

Log(ex.ToString(), GetExecutingMethodName());
Run Code Online (Sandbox Code Playgroud)

但我得到的结果System.Windows.Forms.Control.OnClick不是FillCombo.

如何获取导致异常的方法的实际名称?

c# exception

17
推荐指数
3
解决办法
2万
查看次数

C#ASP.NET Core Serilog添加类名称和方法进行记录

我最近将日志记录添加到了ASP.Net Core项目中。当前,日志以以下格式写入.txt文件:

{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level}] {消息} {NewLine} {Exception}

例如:

2017-11-30 13:58:22.229 +01:00 [信息]在数据库中创建的项目。

很好,但是我想输入要记录到该.txt文件的类的名称和方法。例如,当类A使用方法B向数据库中写入一些内容并将其记录下来时,我希望看到类似

ClassA.MethodB:在数据库中创建的项目

所有记录日志的类都将其Logger注入到其构造函数中,例如

public class ClassA
{
    private readonly ILogger _log;

    public ClassA(ILogger<ClassA> log){
        _log = log;
    }

    public void AddItemToDb(Item item){
        //Add item
        //On success: 
        _log.LogInfo("Added item to db.");
    }
}
Run Code Online (Sandbox Code Playgroud)

我当前正在使用Serilog并使用以下LoggerConfiguration:

var logger = new LoggerConfiguration()
    .MinimumLevel.Verbose()
    .MinimumLevel.Override("Microsoft", LogEventLevel.Warning)
    .WriteTo.RollingFile(Configuration.GetValue<string>("LogFilePath") + "-{Date}.txt", LogEventLevel.Information)
    .CreateLogger();
Run Code Online (Sandbox Code Playgroud)

如何将类和方法添加到日志中?

编辑

我向.WriteTo.Rollingfile()方法添加了一个自定义outputTemplate,如下所示:

"{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level}] ({SourceContext}) {Message}{NewLine}{Exception}")
Run Code Online (Sandbox Code Playgroud)

这导致将名称空间和类添加到日志中,现在仅缺少该方法

c# asp.net logging serilog asp.net-core

5
推荐指数
2
解决办法
1万
查看次数