Ответ 1
Include требует имя свойства, а не имя класса. Следовательно, это имя свойства, которое вы хотите, а не имя его типа. Вы можете получить это с отражением.
Есть ли способ взять имя класса и преобразовать его в строку в С#?
Как часть Entity Framework, метод .Include принимает список строк, разделенных точками, для объединения при выполнении запроса. У меня есть модель класса, к которой я хочу присоединиться, а также по причинам рефакторинга и дальнейшего обслуживания кода я хочу иметь возможность безопасности во время компиляции при обращении к этому классу.
Таким образом, есть ли способ, которым я мог бы это сделать:
class Foo
{
}
tblBar.Include ( Foo.GetType().ToString() );
Я не думаю, что могу сделать GetType() без экземпляра. Любые идеи?
Include требует имя свойства, а не имя класса. Следовательно, это имя свойства, которое вы хотите, а не имя его типа. Вы можете получить это с отражением.
Вы не можете использовать .GetType()
без экземпляра, потому что GetType
- это метод.
Вы можете получить имя из типа, но вот так:
typeof(Foo).Name
И как указано Крисом, если вам нужно квалифицированное имя сборки, вы можете использовать
typeof(Foo).AssemblyQualifiedName
Вы также можете сделать что-то вроде этого:
Type CLASS = typeof(MyClass);
И тогда вы можете просто получить доступ к имени, пространству имен и т.д.
string CLASS_NAME = CLASS.Name;
string NAMESPACE = CLASS.Namespace;
typeof(Foo).ToString()
?
Вы можете использовать DbSet<contact>
вместо ObjectSet<contact>
, поэтому вы можете использовать lambda в качестве параметра, например tblBar.Include(a => a.foo)
Другой альтернативой, использующей отражение, является использование класса MethodBase.
В вашем примере вы можете добавить статическое свойство (или метод), которое предоставит вам необходимую информацию. Что-то вроде:
class Foo
{
public static string ClassName
{
get
{
return MethodBase.GetCurrentMethod().DeclaringType.Name;
}
}
}
Это позволит вам использовать его без генерации экземпляра типа:
tblBar.Include(Foo.ClassName);
Что во время выполнения даст вам:
tblBar.Include("Foo");