C# 获取参数的旧名称

C# 获取参数的旧名称,c#,.net,logging,naming-conventions,C#,.net,Logging,Naming Conventions,当我在跟踪时,我认为做以下事情会很有用 //In the main function { Log(myVariable); } 它将变量发送到这样的泛型函数 //In the Logger file public static void TraceMessage<T>(T aVariable) { string oldName=GetOldName(aVariable); } 我希望将myVariable分配给oldName。GetOldName应该做什么 这里也有类似

当我在跟踪时,我认为做以下事情会很有用

//In the main function
{
  Log(myVariable);
}
它将变量发送到这样的泛型函数

//In the Logger file
public static void TraceMessage<T>(T aVariable)
{
   string oldName=GetOldName(aVariable);
}
我希望将myVariable分配给oldName。GetOldName应该做什么

这里也有类似的问题:

但在所有这些情况下,aVariable被分配给oldName

更新:旧名称是参数/变量在发送到函数之前被调用的名称。我在这里使用它作为变量只是为了便于解释。 原因是调试。当我的程序收到错误时,我想知道变量的值是多少。我目前必须发送Log错误、变量名和变量值。当您编写1000条这些调试语句时,您会想到简化的方法。我所问的问题将简化这个问题


为什么我的问题被否决?我如何改进问题?

来电者需要捕获并提供此信息。在C 6中,使用nameof运算符可以很容易地实现这一点,尽管您需要在调用方代码中应用这一点:

Log(myVariable, nameof(myVariable));
编辑:如果只想指定一次变量,可以使用:

Log(() => myVariable);
并将日志方法定义为:

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

但是,这将比备选方案慢得多。

你说的旧名称是什么意思?我认为这是不可能的。我也不认为这是必要的。你为什么要这么做?别让落选票影响你。我对你投了更高的票,因为我觉得这是一个有效的问题,即使不存在实现你要求的方法。编辑是一个非常好的解决方案,但如果有一个没有=>,它会更好。在这种情况下,保留问题。我很想知道有没有。作为记录,我个人不会在我的代码中使用lambdas,因为我提到了速度和缺乏规范的问题;我更喜欢使用LogmyVariable,即myvariable的名称。