【问题标题】:Get a parameter's old name获取参数的旧名称
【发布时间】:2015-08-21 19:35:11
【问题描述】:

当我在追踪时,我认为这样做会很有用

//In the main function
{
  Log(myVariable);
}

将变量发送到这样的通用函数

//In the Logger file
public static void TraceMessage<T>(T aVariable)
{
   string oldName=GetOldName(aVariable);
}

我希望将“myVariable”分配给oldNameGetOldName应该怎么做?

这里有人问过类似的问题:

get name of a variable or parameter

但在所有这些情况下,“aVariable”都分配给oldName

更新:旧名称是参数/变量在发送到函数之前被调用的名称。我在这里将其用作变量只是为了便于解释。 原因是调试。当我的程序收到错误时,我想知道我的变量的值是什么。我目前必须发送日志(错误变量名变量值)。当您编写 1000 个这些 Debug 语句时,您会想到可以简化的方法。我的要求会简化问题。

为什么我的问题被否决了,我该如何改进这个问题?

【问题讨论】:

  • oldName 是什么意思?
  • 我认为这是不可能的。我也觉得没必要。为什么你需要这样做?
  • 不要让反对票影响到你。我赞成你,因为我觉得这是一个有效的问题,即使它不存在实现你所要求的方法。

标签: c# .net logging naming-conventions


【解决方案1】:

此信息需要由调用者捕获和提供。在 C# 6 中,可以使用 nameof 运算符轻松实现,尽管您需要在调用者代码中应用它:

Log(myVariable, nameof(myVariable));

编辑:如果你只想指定你的变量一次,你可以使用:

Log(() => myVariable);

并将您的 Log 方法定义为:

public static void Log<T>(Expression<Func<T>> expression)
{
    string oldName = ((MemberExpression)expression.Body).Member.Name;
    object value = expression.Compile().Invoke();
}

但是,这将比替代方案和is not guaranteed behaviour 慢得多。

【讨论】:

  • 编辑是一个很好的解决方案,但如果有没有()=>的,那就更好了。
  • 在这种情况下,让问题悬而未决。我很想知道是否存在一个。作为记录,由于我提到的问题(速度和缺乏规范),我个人不会在我的代码中使用 lambda;我更喜欢Log(myVariable, nameof(myVariable))
猜你喜欢
  • 2010-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-09
  • 2016-10-21
  • 2015-10-01
  • 1970-01-01
  • 2017-01-22
相关资源
最近更新 更多