我正在尝试获取类变量名
static void Main()
{
TaskAction m_first = new TaskAction();
m_first.Increment();
m_first.Increment();
TaskAction m_Second = new TaskAction();
m_Second.Increment();
}
public class TaskAction
{
private int m_Current;
public TaskAction()
{
m_Current = 0;
}
public void Increment()
{
m_Current++;
write(" TaskAction " + vairableName + " " + m_Current);
}
}
我要写出来:
TaskAction m_first 1
TaskAction m_first 2
TaskAction m_second 1
答案 0 :(得分:2)
像这样检索有关程序的元数据既复杂又不必要,只需将名称传递给构造函数即可添加。
static void Main()
{
TaskAction m_first = new TaskAction("m_first");
m_first.Increment();
m_first.Increment();
TaskAction m_Second = new TaskAction("m_Second");
m_Second.Increment();
}
public class TaskAction
{
private int m_Current;
private string m_taskName;
public TaskAction(string taskName)
{
m_taskName = taskName;
m_Current = 0;
}
public void Increment()
{
m_Current++;
write(" TaskAction " + m_taskName + " " + m_Current);
}
}
答案 1 :(得分:0)
简短答案:您不能。
详细答案:
从技术上讲,可以通过检查IL(由C#编译器创建的中间语言)来确定变量名,但是此操作困难且容易出错。此外,您会忽略一些重要问题:
首先,正如这里已经问到的:为什么?这样的事情将如何增强您的程序?
该类的每个实例可以有多个指向它的变量(请参见我有关.NET here中类型的答案)。您想得到哪一个?例如,考虑以下程序:
var v1 = new TaskAction();
var c2 = new TaskAction();
c1.Increment(); // 1 c1
c2 = c1;
c2.Increment(); // 2 c1? 2 c2? 2 c1 c2?
由于您没有提供足够的信息,所以我不知道您为什么要这么做。但是这里有一些解决方案:
例如,如果要使用类别进行日志记录-只需将类别传递给构造函数即可,如上文所述。
如果您想知道变量是哪种类型-即使有约定,使用变量名也是非常非常糟糕的方法-改用(最好)多态,或者至少用{检查类型{1}} / is
,例如:
as
请注意,这违反了OOP原则:一个类不应该知道其驱动类。
希望这对您有所帮助。祝你有美好的一天!
您可以执行以下操作之一:
最好-调试代码,查看调用堆栈等。
更糟-打印调用方方法名称,而不是对象名称。可以使用if (this is Drived)
{
((Drived)this).SomeDrivedMethod();
}
:
System.Runtime.CompilerServices.CallerMemberNameAttribute
注意:编译器填充void Increment([System.Runtime.CompilerServices.CallerMemberName] string caller = null)
{
// Default value to `caller` is neccessary
// ...
Console.WriteLine("Caller: {0}", caller);
}
参数,而不是在运行时填充。
答案 2 :(得分:-3)
如果要使用自定义构造函数唯一地标识类对象或为类提供名称,请获取object.GetHashCode()。