Получить имя класса в виде строки в C # - PullRequest
65 голосов
/ 07 октября 2008

Есть ли способ взять имя класса и преобразовать его в строку в C #?

Как часть Entity Framework, метод .Include принимает список строк, разделенных точками, для присоединения при выполнении запроса. У меня есть модель класса, к которой я хочу присоединиться, и по причинам рефакторинга и будущего обслуживания кода я хочу иметь возможность безопасности во время компиляции при обращении к этому классу.

Таким образом, есть ли способ, которым я мог бы сделать это:

class Foo
{
}

tblBar.Include ( Foo.GetType().ToString() );

Не думаю, что смогу сделать GetType () без экземпляра. Есть идеи?

Ответы [ 6 ]

100 голосов
/ 07 октября 2008

Вы не можете использовать .GetType() без экземпляра, потому что GetType - это метод.

Вы можете получить имя от типа, хотя, как это:

typeof(Foo).Name

И, как указал Крис, если вам нужно квалифицированное имя сборки, вы можете использовать

typeof(Foo).AssemblyQualifiedName
12 голосов
/ 07 октября 2008

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

8 голосов
/ 02 октября 2012

Вы также можете сделать что-то вроде этого:

Type CLASS = typeof(MyClass);

И тогда вы можете просто получить доступ к имени, пространству имен и т. Д.

 string CLASS_NAME = CLASS.Name;
 string NAMESPACE = CLASS.Namespace;
2 голосов
/ 07 октября 2008
typeof(Foo).ToString()

0 голосов
/ 19 ноября 2013

Еще одна альтернатива, использующая отражение, - это использование класса MethodBase.

В вашем примере вы можете добавить статическое свойство (или метод), которое предоставляет вам необходимую информацию. Что-то вроде:

class Foo
{
    public static string ClassName
    {
        get
        {
            return MethodBase.GetCurrentMethod().DeclaringType.Name;
        }
    }
}

Что позволит вам использовать его без генерации экземпляра типа:

tblBar.Include(Foo.ClassName);

Что во время выполнения даст вам:

tblBar.Include("Foo");
0 голосов
/ 15 июля 2011

Вы можете использовать DbSet<contact> вместо ObjectSet<contact>, поэтому вы можете использовать лямбду в качестве параметра, например, tblBar.Include(a => a.foo)

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