我知道你能做到
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) 就像标题所说:反射可以为您提供当前正在执行的方法的名称.
由于海森堡的问题,我倾向于不猜.如何在不改变当前方法的情况下调用一种方法来告诉您当前的方法?但是我希望有人可以在那里证明我的错.
更新:
最终结果
我了解了MethodBase.GetCurrentMethod().我还了解到,我不仅可以创建堆栈跟踪,而且如果需要,我只能创建我需要的确切帧.
要在属性中使用它,只需使用.Substring(4)删除'set_'或'get_'.
无论如何从异步函数中获取当前方法名称?
我试过了:
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"
有任何想法吗?注意我正在调用的通用记录器函数是同一个类中的静态方法(现在必须以这种方式...).
使用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.知道如何让它记录一个实际的方法名称?
我知道.类似的问题已经提出过了.
但我还没有得到确切的解决方案.
我有一个按钮点击事件,我有一个方法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.
如何获取导致异常的方法的实际名称?
我最近将日志记录添加到了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# ×5
async-await ×2
.net ×1
asp.net ×1
asp.net-core ×1
exception ×1
log4net ×1
logging ×1
methodbase ×1
reflection ×1
serilog ×1