2009-12-09 2 views
0

Можно создать дубликат:
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, но ответьте для другой платформы/языка может быть полезно.

+1

дубликата http://stackoverflow.com/questions/729803/print-name-of-the-variable-in-c –

+0

объектов не имеют имен. Переменные имеют имена, а переменные содержат _references_ для объектов. Кроме того, две переменные (возможно, с разными именами) могут ссылаться на один и тот же объект. –

+0

Какой язык вы используете специально? Я пытался воссоздать VB.NET, не повезло ... – Moshe

ответ

-1

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

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

EDIT: И в этом причина, сказано: напишите код для людей, чтобы понять и, кстати, для компилятора.

+1

Как всегда, пожалуйста, объясните, когда downvoting, почему? – shahkalpesh

+0

А? Поэтому у меня есть этот «Словарь <строка, объект>». И у меня есть эти переменные 's' и' t', объявленные следующим образом: 'string s =" Hello, world! "И' string t = s'. И я предполагаю, что в этом словаре я помещаю '(" s "," Hello, World! ")' И '(" t "," Hello, World! ")'. Итак, теперь я использую этот метод 'printName', который вызывается через' printName (s) '. Итак, как я могу использовать этот словарь для поиска '' s ''? И откуда я знаю, что я не должен находить '' t ''? – jason

+0

@ Джейсон: Вы правы. Сценарий, в котором экземпляр ссылается на две переменные, завершится неудачей. Я ответил, просто посмотрев на код OP. Я ошибаюсь в размещении словаря ', это может быть' Dictionary ', в результате чего экземпляр объекта можно поместить как ключ и имя переменной в качестве значения. Единственное условие заключается в том, что объект не должен был быть добавлен в словарь уже. – shahkalpesh

1

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

0

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

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

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

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

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

printName("Hello, world!"); 
+0

@ Джейсон: Пожалуйста, см. Мой ответ на ваш комментарий выше. Надеюсь, я говорю с чувством :) – shahkalpesh

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 вдоль линий имени переменного даже не присутствующий во время выполнения.

EDIT Увы, я был неправ. Вдохновленный Джоном Скитом post об обработке обработки исключений Null Reference и внезапно напоминающем о проецировании, есть способ сделать это.

Вот полный рабочий codez:

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

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

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

Рассмотрим это:

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

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

-1

Вам необходимо разместить свойство 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); 
} 
+0

Это не работает, если объект, переданный 'printName', не имеет свойства' Name'. – jason

+0

Если вы правильно прочитали printName, вы увидите, что он принимает объект MyClass, который, как гарантируется, имеет имя. – Will

+0

Ваш антецедент правилен, но следствие неверно. Здесь: 'void printName (Object o)'. Обратите также внимание на то, что он говорит: «[h] ow Я могу напечатать имя любого объекта [?]». – jason

Смежные вопросы