2011-03-01 8 views
0

내 기본 클래스는 파생 클래스에서 리플렉션을 사용하여 일부 기능을 제공합니다. 현재 저는 이렇게하고 있습니다 :제네릭없이 기본 클래스에서 파생 클래스의 형식을 얻는 방법?

abstract class BaseClass<T> 
{ 
    string GetClassString() 
    { 
     // Iterate through derived class, and play with it's properties 
     // So I need to know the type of derived class (here T). 
     return result; 
    } 

    static bool TryParse(string classString, out T result) 
    { 
     // I should declare a variable as T and return it 
    } 
} 

제네릭없이 이것을 할 수 있습니까?

+2

'T' *는 파생 클래스의 유형이 아니거나 적어도 반드시 필요하지는 않습니다. 'class MyDerivedClass : BaseClass '을 상상해 보라. 여기서 파생 클래스는'MyDerivedClass'이지만'T'는'string'입니다. –

+0

@ 존 : 그렇다면'TryParse (string classString, out T derivedType) '을 어떻게 선언할까요? 'C#'는 메소드 서명에서'derivedType'을 동적으로 정의하고'T'를 사용하지 않습니까? – Xaqron

답변

4

편집 :

죄송합니다 (예 : typeof(T)) 형식 매개 변수를 원한다. 그런 경우에도 여전히 this.GetType()을 사용하지만 .GetGenericArguments()[0]을 후에 추가하십시오.

시도의 구문 분석 : 당신은 두 가지 방법이 있습니다

을 모르는 유형의 새 인스턴스를 생성해야합니다 첫째, 액티베이터 클래스와 다음 코드로, 나머지를 변경하지 않고 :

result = (T) Activator.CreateInstance(typeof(T)) 

(MSDN)입니다.

그런 다음, 당신은 당신의 유형 "새로운"제약 조건을 추가 할 수 있습니다

MyClass<T> where T : new() {...} 
result = new T(); 

두 샘플이 매개 변수 덜 생성자가 필요합니다. 매개 변수를 전달하려면 System.Reflection 내부로 깊숙이 들어가서 생성자 목록을 가져 와서 원하는 매개 변수를 호출해야합니다. 팩토리 패턴도 작업을 수행 할 수 있습니다.

+0

그리고'TryParse' 메서드에 대해 (편집에 추가 한 것)? – Xaqron

+0

다른 편집에서 힌트를 추가했습니다. –

관련 문제