Горячий получить название объекта?
Возможный дубликат:
вывести имя переменной в 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);
}