Горячий получить название объекта?

Возможный дубликат:
вывести имя переменной в 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 ответов

Имя не существует за пределами исходного кода - чтобы сделать это, вы должны быть присоединены к себе как отладчик или копаться в PDB. Короче говоря, это не практично ни в какой мере для C# и большинства других языков.

Это не имеет смысла по следующей причине:

Сам объект находится в памяти и не имеет имени. Вы получаете доступ к нему, используя ссылку, которая имеет имя. Таким образом, имя ссылки может измениться в любой момент, у вас может быть 50 ссылок, "указывающих" на один и тот же безымянный объект и т. Д.

Учти это:

MyClass c1, c2;
c1 = new MyClass();
c2 = c1;
printName(c1);
printName(c2);

Как вы можете видеть, и c1, и c2 являются ссылками на один и тот же объект, который не может "узнать", кто на него ссылается или по какому имени.

Это невозможно.

Каков результат этого?

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

Как s а также t оба относятся к одному и тому же случаю string нет никакого способа отличить вызовы printName с s как параметр против t в качестве параметра.

И каков должен быть результат этого?

printName("Hello, world!");

Я не думаю, что это теоретически возможно. Подумайте об этом сценарии:

MyClass a, b;
a = new MyClass();
b = a;

Console.WriteLine("name of b is " + SomeMagicClass.GetVarName(b));
//Should it be "b" or "a"?

Я уверен, что есть лучшее объяснение, включающее сгенерированный код MIDL вдоль строк имени переменной, даже не присутствующей во время выполнения.

РЕДАКТИРОВАТЬ Увы, я был не прав. Вдохновленный постом Джона Скита об обработке исключений Null Reference, и неожиданно напомнив о проекции, есть способ сделать это.

Вот полный рабочий кодез:

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());
    }
}

Это невозможно.
Имя переменной имеет значение только для разработчика (не для компилятора или среды выполнения).

Вы могли бы создать Dictionary<string, object> & добавить эти экземпляры с именем их переменной, чтобы достичь чего-то подобного.

РЕДАКТИРОВАТЬ: И это причина, как говорится - написать код для людей, чтобы понять и, кстати, для компилятора.

Вам необходимо поместить свойство Name в ваш класс MyClass, например.

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);
}
Другие вопросы по тегам