Hot得到一个对象的名字?

时间:2009-12-09 04:26:40

标签: .net

  

可能重复:
  print name of the variable in c#

如何打印任何对象的名称

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的,但其他平台/语言的答案可能会有所帮助。

6 个答案:

答案 0 :(得分:1)

源代码之外不存在该名称 - 要做到这一点,您必须作为调试器附加到自己,或者通过PDB进行挖掘。简而言之,对于C#和大多数其他语言而言,这都不实用。

答案 1 :(得分:0)

这是不可能的。

这是什么结果?

string s = "Hello, world!";
string t = s;
printName(t);

由于st都引用string的同一个实例,因此无法区分printNames的调用作为参数与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);
}