2008-10-07 10 views
64

클래스 이름을 사용하여 C#으로 문자열로 변환 할 수있는 방법이 있습니까?C#에서 문자열의 클래스 이름 가져 오기

Entity Framework의 일부로 .Include 메서드는 쿼리를 수행 할 때 점으로 구분 된 문자열 목록을 결합하여 결합합니다. 내가 참여하고자하는 클래스 모델을 가지고 있으며, 리팩토링 및 향후 코드 유지 관리의 이유로,이 클래스를 참조 할 때 컴파일 타임 안전을 유지할 수 있기를 원합니다.

class Foo 
{ 
} 

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

내가 인스턴스없이 GetType을()를 할 수 있다고 생각하지 않습니다

따라서, 나는이 작업을 수행 할 수있는 방법이있다. 어떤 아이디어?

답변

12

Include requires a property name, 클래스 이름이 아닙니다. 따라서 원하는 유형의 이름이 아니라 원하는 속성의 이름입니다. You can get that with reflection.

+0

감사 크레이그, 나 '에게 이 또한 도움이 발견 : http://msmvps.com/blogs/matthieu/archive/2008/06/06/entityframework-include-with-func.aspx – Jared

97

GetType은 메소드이므로 인스턴스없이 .GetType()을 사용할 수 없습니다.

당신은 같은 비록 유형의 이름을 얻을 수 있습니다 : 크리스 지적대로 조립 자격을 갖춘 이름을 필요로하는 경우

typeof(Foo).Name 

그리고

, 당신은 사용할 수 있습니다

typeof(Foo).AssemblyQualifiedName 
2
typeof(Foo).ToString() 

?

0

매개 변수로 람다를 사용할 수 있도록 당신은 대신 ObjectSet<contact>DbSet<contact>을 사용할 수 있습니다, 예를 들어 tblBar.Include(a => a.foo)

8

또한이 같은 것을 할 수있는 :

Type CLASS = typeof(MyClass); 

을 그리고 당신은 단지에 액세스 할 수 있습니다 이름, 네임 스페이스 등

string CLASS_NAME = CLASS.Name; 
string NAMESPACE = CLASS.Namespace; 
0

리플렉션을 사용하는 다른 방법으로는 MethodBase 클래스를 사용하는 것입니다.

예를 들어, 원하는 정보를 제공하는 정적 속성 (또는 메서드)을 추가 할 수 있습니다. 뭔가 같은 : 당신이 형식의 인스턴스를 생성하지 않고 사용할 수 있도록 할

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

:

tblBar.Include(Foo.ClassName); 

런타임에 당신을 줄 것이다 :

tblBar.Include("Foo");