В нестатическом методе я мог бы использовать, this.GetType()
и он вернул бы Type
. Как я могу получить то же самое Type
в статическом методе? Конечно, я не могу просто писать, typeof(ThisTypeName)
потому что ThisTypeName
это известно только во время выполнения. Спасибо!
c#
.net
types
static-methods
Егор
источник
источник
Ответы:
Если вы ищете 1 лайнер, эквивалентный
this.GetType()
статическим методам, попробуйте следующее.Хотя это, вероятно, намного дороже, чем просто использовать
typeof(TheTypeName)
.источник
typeof(TheTypeName)
все равно должен позаботиться об этом .Есть кое-что, что другие ответы не совсем прояснили, и что имеет отношение к вашей идее о том, что тип доступен только во время выполнения.
Если вы используете производный тип для выполнения статического члена, настоящее имя типа в двоичном файле опускается. Так, например, скомпилируйте этот код:
Теперь используйте ildasm ... вы увидите, что вызов излучается следующим образом:
Компилятор разрешил вызов
Encoding.GetEncoding
- не осталось никаких следовUnicodeEncoding
. Боюсь, это делает ваше представление о "нынешнем типе" бессмысленным.источник
Другое решение - использовать самореференционный тип
Затем в классе, который его наследует, я создаю тип со ссылкой на себя:
Теперь тип вызова typeof (TSelfReferenceType) внутри Parent будет получать и возвращать Type вызывающего абонента без необходимости в экземпляре.
-Роб
источник
Вы не можете использовать
this
статический метод, поэтому это невозможно напрямую. Однако, если вам нужен тип какого-либо объекта, просто вызовитеGetType
его и сделайтеthis
экземпляр параметром, который вы должны передать, например:Хотя это кажется плохим дизайном. Вы уверены, что вам действительно нужно получить тип самого экземпляра внутри его собственного статического метода? Это кажется немного странным. Почему бы просто не использовать метод экземпляра?
источник
Я не понимаю, почему вы не можете использовать typeof (ThisTypeName). Если это неуниверсальный тип, то это должно работать:
Если это общий тип, то:
Я упустил что-то очевидное?
источник
Когда ваш член статический, вы всегда будете знать, к какому типу он принадлежит во время выполнения. В таком случае:
Вы не можете звонить (редактировать: очевидно, вы можете, см. Комментарий ниже, но вы все равно будете звонить в A):
поскольку член является статическим, он не участвует в сценариях наследования. Следовательно, вы всегда знаете, что это тип А.
источник
Для моих целей мне нравится идея @T-moty. Несмотря на то, что я много лет использовал информацию о типе с саморегулированием, позже ссылаться на базовый класс будет труднее.
Например (используя пример @Rob Leclerc сверху):
Например, работа с этим шаблоном может быть сложной; как вернуть базовый класс из вызова функции?
Или при приведении типов?
Поэтому я стараюсь избегать этого, когда могу, и использую, когда необходимо. Если необходимо, я бы посоветовал вам следовать этому шаблону:
Теперь вы можете (более) легко работать с
BaseClass
. Однако бывают случаи, как моя текущая ситуация, когда раскрытие производного класса из базового класса не требуется, и использование предложения @ M-moty может быть правильным подходом.Однако использование кода @ M-moty работает только до тех пор, пока базовый класс не содержит конструкторов экземпляров в стеке вызовов. К сожалению, в моих базовых классах используются конструкторы экземпляров.
Поэтому вот мой метод расширения, который учитывает конструкторы экземпляра базового класса:
источник
ИЗМЕНИТЬ Эти методы будут работать только тогда, когда вы развертываете файлы PDB с исполняемым файлом / библиотекой, как мне указал markmnl .
В противном случае будет обнаружена огромная проблема: хорошо работает в разработке, но, возможно, не в производстве.
Служебный метод, просто вызовите метод, когда вам нужно, из любого места вашего кода:
источник