如何打印任何对象的名称
MyClass c1, c2;
printName(c1);
printName(c2);
void printName(Object o)
{
Console.WriteLine("name of object : "+ o.???());
}
输出应该是这样的:
name of object : c1
name of object : c2
这是针对.Net的,但其他平台/语言的答案可能会有所帮助。
答案 0 :(得分:1)
源代码之外不存在该名称 - 要做到这一点,您必须作为调试器附加到自己,或者通过PDB进行挖掘。简而言之,对于C#和大多数其他语言而言,这都不实用。
答案 1 :(得分:0)
这是不可能的。
这是什么结果?
string s = "Hello, world!";
string t = s;
printName(t);
由于s
和t
都引用string
的同一个实例,因此无法区分printName
和s
的调用作为参数与t
作为参数。
这应该是什么结果?
printName("Hello, world!");
答案 2 :(得分:0)
我认为这在理论上是不可能的。想想这个场景:
MyClass a, b;
a = new MyClass();
b = a;
Console.WriteLine("name of b is " + SomeMagicClass.GetVarName(b));
//Should it be "b" or "a"?
我确信有一个更好的解释,涉及生成的MIDL代码沿变量名称的行甚至不存在于运行时。
编辑唉,我错了。灵感来自Jon Skeet关于Null Reference异常处理的post,突然被提醒有关投影,有一种方法可以做到这一点。
这是完整的工作代码:
public static class ObjectExtensions {
public static string GetVariableName<T>(this T obj) {
System.Reflection.PropertyInfo[] objGetTypeGetProperties = obj.GetType().GetProperties();
if(objGetTypeGetProperties.Length == 1)
return objGetTypeGetProperties[0].Name;
else
throw new ArgumentException("object must contain one property");
}
}
class Program {
static void Main(string[] args) {
string strName = "sdsd";
Console.WriteLine(new {strName}.GetVariableName());
int intName = 2343;
Console.WriteLine(new { intName }.GetVariableName());
}
}
答案 3 :(得分:0)
由于以下原因,这没有意义:
对象本身在内存中,没有名称。您正在使用具有名称的引用访问它。因此,引用名称可以随时更改,您可以将50个引用“指向”同一个无名对象等。
考虑一下:
MyClass c1, c2;
c1 = new MyClass();
c2 = c1;
printName(c1);
printName(c2);
正如你所看到的,c1和c2都是对完全相同的对象的引用,它无法“知道”谁引用它或者通过哪个名称。
答案 4 :(得分:-1)
这是不可能的。
变量的名称仅对开发人员(而不是编译器或运行时)很重要。
您可以创建Dictionary<string, object>
&amp;添加那些带有变量名称的实例来实现这样的目标。
编辑:这就是为什么 - 为人们编写代码以供编译器理解和编写代码的原因。
答案 5 :(得分:-1)
您需要在MyClass类中放置一个Name属性,例如
class MyClass {
public string Name {get;set;}
// rest of class goes here
// ...
}
然后您可以按如下方式使用它:
var c1 = new MyClass() { Name = "c1" };
var c2 = new MyClass() { Name = "c2" };
printName(c1);
printName(c2);
void printName(MyClass o)
{
Console.WriteLine("name of object : "+ o.Name);
}