C # Получить имя объявления класса - PullRequest
0 голосов
/ 25 апреля 2018

Можно ли получить имя объявления класса (динамически) и передать его в качестве параметра в конструкторе, чтобы установить переменную имени в самом классе?

Пример:

public class Foo
{
    public string name;
    public Foo()
    {
        name = GetClassName();
    }
}

public class SomeOtherClass
{
    Foo className = new Foo();
    Console.WriteLine(foo.name);
}

В результате я ожидал, что он напишет: "className".

Ответы [ 2 ]

0 голосов
/ 25 апреля 2018

Звучит как странное требование.Переменная - это не что иное, как ссылка на объект.Имя этой ссылки никоим образом не связано с чем этой переменной.Таким образом, объект, на который имеется ссылка, ничего не знает о своих ссылках.На самом деле вы можете иметь даже несколько ссылок на один и тот же Foo -экземпляр.Так как же instance знать, на какую переменную вы ссылаетесь?Итак, что должно произойти в следующем примере:

var f = new Foo();
var b = f;

Теперь у вас есть две ссылки на один и тот же экземпляр Foo.Экземпляр не может знать, какой из шлангов подходит, если вы не предоставите эту информацию ему, используя параметр (например, своему конструктору).Ситуация становится еще хуже, если у вас есть фабрика, создающая ваш Foo -экземпляр:

void CreateFoo()
{
    return new Foo();
}
// ...
var f = CreateFoo();

Теперь у вас есть еще одно косвенное указание, конструктор Foo наверняка не сможет всплыть, хотя все слои в вашем вызове-стекать, пока не достигнет какого-либо назначения , где он может получить действительное имя.На самом деле возможно, что вы даже не назначаете свой экземпляр на что-нибудь - хотя это просто хорошая идея:

CreateFoo();  // create an instance and throw it away

В любом случае, если вы хотите установить член вДля экземпляра какого-либо значения вы должны предоставить это значение для экземпляра.Ответ Патрика показывает, как это сделать.

0 голосов
/ 25 апреля 2018

Нет. Это невозможно. Невозможно передать имя переменной без использования параметра.

Это самое близкое, что вы можете получить:

Foo className = new Foo(nameof(className));
...