2012-02-06 2 views
9

System.Type을 일반 유형 정의로 변환하고 싶습니다. 따라서 generic 메소드를 호출하는 데 사용할 수 있습니다. 기본적으로 typeof의 반대입니다. 그냥 몇 가지 자세한 내용유형을 일반 클래스 정의로 변환

public class BaseAppContext { 

    private Type settingsType; 

    public Type SettingsType 
    { 
     get { return this.settingsType; } 
     set { this.SettingsType = value; } 
    }  

    public void MyFunction() { 
     MyStaticClass.GetData<classof(this.SettingsType)>(); 
    } 
} 

:

예 (나는 문제가있어 어디 classof 실제 .NET의 방법은 아닙니다 당신이 볼 수 있도록 내가 실제 솔루션을 필요가있다 "classof"를 사용) 왜 내가이 이상한 방법으로 문제를 처리하는지. BaseAppContext는 많은 다른 클래스에 의해 참조되는 클래스입니다. 코드의 다른 부분이 많이 변경된다는 것을 의미하는 Generic으로 만들면 좋지 않을 것입니다. 나는 프레임 워크를 작성 중이므로, 프레임 워크가 한 번 타입을 입력하고 싶습니다. 개발자는 메소드를 호출 할 때마다 타입을 처리하지 않고도 제공된 함수를 사용할 수 있습니다.

+0

그건 의미가 없습니다. 'List '으로 무엇을 할 수 있습니까? 제약 조건은 어떻습니까? – SLaks

답변

3

이것은 근본적으로 불가능합니다.
Generics form compile-time types; 런타임에만 알려진 유형의 컴파일 타임 유형을 작성할 수 없습니다.

대신 반사를 사용해야하거나 다른 디자인을 사용해야합니다 (예 : 비 제너릭 방법).

+0

Laks, [this] (http://stackoverflow.com/questions/31771628/getting-the-dbcontext-dbsets-using-reflection-and-having-a-cast-to-the-properge) 어떻게해야합니까? – Veverke

2

이를 달성하기 위해, 당신은 반사를 사용해야합니다 :

public void MyFunction() { 
    var method = typeof(MyStaticClass).GetMethod("GetData").MakeGenericMethod(SettingsType); 
    method.Invoke(null, null); 
} 

그러나, 나는이 일을 권하고 싶지 않다 대신 솔루션을 재 설계 권합니다. 리플렉션을 사용한다는 것은 언어가 제공하는 모든 멋진 컴파일 타임 안전을 놓치게된다는 것을 의미합니다. 이것은 일반적으로 더 부서지기 쉽고 관리하기 어려운 코드로 이어집니다.

4

SettingsType이 런타임에 설정되고 <> 사이의 코드가 컴파일되므로 이것이 불가능합니다.

var type = Type.GetType(SettingsType); 
var inst = Activator.CreateInstance(type); 

및 인터페이스 또는 기본 클래스에 inst 캐스트 :

이처럼 형식의 인스턴스를 만들 수 있습니다.

정적 클래스를 사용하고 있으므로 부유 한 답변이 더 좋습니다.

관련 문제