Есть ли способ взять имя класса и преобразовать его в строку на C#?
В рамках Entity Framework метод .Include принимает список строк, разделенных точками, для объединения при выполнении запроса. У меня есть модель класса того, к чему я хочу присоединиться, и по причинам рефакторинга и будущей поддержки кода я хочу иметь возможность иметь безопасность во время компиляции при обращении к этому классу.
Итак, есть ли способ сделать это:
class Foo
{
}
tblBar.Include ( Foo.GetType().ToString() );
Не думаю, что смогу выполнить GetType () без экземпляра. Есть идеи?





Вы не можете использовать .GetType() без экземпляра, потому что GetType - это метод.
Вы можете получить имя от типа, хотя и вот так:
typeof(Foo).Name
И, как указал Крис, если вам нужно полное имя сборки, вы можете использовать
typeof(Foo).AssemblyQualifiedName
typeof(Foo).ToString()
?
"Включить" требуется имя свойства, а не имя класса. Следовательно, это имя желаемого свойства, а не имя его типа. Вы можете получить это с помощью отражения.
Вы можете использовать DbSet<contact> вместо ObjectSet<contact>, поэтому вы можете использовать лямбда в качестве параметра, например tblBar.Include(a => a.foo).
Вы также можете сделать что-то вроде этого:
Type CLASS = typeof(MyClass);
И тогда вы можете просто получить доступ к имени, пространству имен и т. д.
string CLASS_NAME = CLASS.Name;
string NAMESPACE = CLASS.Namespace;
Другой альтернативой использованию отражения является использование класса MethodBase.
В вашем примере вы можете добавить статическое свойство (или метод), которое предоставляет вам нужную информацию. Что-то типа:
class Foo
{
public static string ClassName
{
get
{
return MethodBase.GetCurrentMethod().DeclaringType.Name;
}
}
}
Что позволит вам использовать его без создания экземпляра типа:
tblBar.Include(Foo.ClassName);
Что во время выполнения даст вам:
tblBar.Include("Foo");
Спасибо, Крейг, я обнаружил, что это тоже помогло: msmvps.com/blogs/matthieu/archive/2008/06/06/…