C # Получение имени класса в статическом методе - PullRequest
6 голосов
/ 21 июля 2011

Пример:

namespace MyProgram.Testing
{

    public class Test1
    {
        public void TestMethod()
        {
            String actualType = this.GetType().FullName.ToString();
            return;
        }

        public static String GetInheritedClassName()
        {
            return System.Reflection.MethodBase.GetCurrentMethod().ReflectedType.FullName;
        }

    }

    public class Test2 : Test1
    {
    }

    public class Test3
    {
       String test2ClassName = Test2.GetInheritedClassName();
    }
}

В любом случае, я хочу, чтобы он возвращал «MyProgram.Testing.Test2», но вместо этого Test2.GetInheritedClassName () возвращает «MyProgram.Testing.Test1». Что мне нужно поместить в этот статический класс, чтобы он возвратил это (если возможно)?

Ответы [ 2 ]

6 голосов
/ 21 июля 2011

Это невозможно. Когда вы вызываете Test2.GetInheritedClassName, на самом деле вызывается Test1.GetInheritedClassName, потому что Test2.GetInheritedClassName на самом деле не существует (кстати, некоторые инструменты, такие как Resharper, будут показывать предупреждение: Доступ к статическому члену типа через производный тип )

Статические члены не участвуют в наследовании, что логично, поскольку наследование имеет смысл только при работе с экземплярами ...

1 голос
/ 21 июля 2011

Код, который печатает тип, является методом базового класса. За исключением редких сценариев «Отражение», таких как приведенные выше, на выполнение не повлияет то, вызывается ли метод с использованием производного или базового типа, поэтому система не делает различий.

Однако вы можете обойти это, определив базовый базовый тип:

    class ClassNameTesterBase<T>where T:ClassNameTester<T>
    {
        public static String getName() { return (typeof(T)).Name; }
    }

и затем определение других типов интереса:

    class ClassNameTester1<T&gt : ClassNameTesterBase<T> ...
    class ClassNameTester2<T&gt : ClassNameTester1<T> ...

Затем можно при желании определить листовые классы:

    class ClassNameTester1 : ClassNameTester1<ClassNameTester1> { }
    class ClassNameTester2 : ClassNameTester2<ClassNameTester2> { }

Одним небольшим предостережением здесь является то, что ClassNameTester2 извлекает свои внутренние данные из ClassNameTester1 , но не может заменить ничего, что связано с ClassNameTester1 ; если он используется как статический класс, это не должно быть проблемой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...