2012-06-10 2 views
3

제너릭 클래스를 만들었지 만, 디자인에서 런타임에 유형을 알고 있으므로 런타임에 유형을 설정하는 방법을 알고 싶습니다.일반 클래스, 런타임에서 유형을 설정하는 방법은 무엇입니까?

예를 들어, 내가 가진 :

public class MyGenericClass<T> 
{ 
.... 
} 

은 그 때 나는 그것을 사용하려고합니다. 이 클래스를 사용하는 다른 클래스의 메서드가 있습니다. 이 클래스의 생성자에서 필자는 원하는 형식을 매개 변수로받습니다. 따라서 필요한 형식을 저장하는 형식 속성이 있습니다. 그래서 이것을 시도하고 있습니다 :

MyGenericClass<_typeNeeded> myClass = new MyGenericClass<typeNeeded>(); 

그러나 이것은 작동하지 않습니다.

내가 만든 클래스에서 런타임에 유형을 어떻게 설정합니까?

저는 C# 4.0을 사용하고 있습니다.

감사합니다. Daimroc.

편집 : 내가하고 싶은 것은 다음과 같습니다. 데이터베이스에 쿼리를 수행해야하는 클래스가 있습니다. 이 쿼리는 항상 동일한 정보 인 클래스를 반환하지만이 클래스를 포함하는 정보는 다른 테이블에서 가져옵니다. 이는 사용할 쿼리를 결정해야하기 때문입니다. 어떤 쿼리를 사용할지 결정하기 위해받은 유형을 사용합니다.

내가 디자인 유형을 모르지만 런타임에입니다.

클래스에 의해 구현 될 인터페이스를 사용할 수 있으며 올바른 클래스로 인스턴스화 된 인터페이스를 사용할 수 있습니다. 그러나이 인스턴스를 사용하면 인스턴스화 순간에 스위치 나 if가 생기게됩니다. 나는 피하려고 노력한다. 나는 좀 더 일반적인 것을 원한다. 또한이 솔루션을 사용하면 instantion 순간에 if를 가질 수 있으므로 generic 클래스를 만들 수 있으므로 클래스가 하나 뿐이므로 유지 관리가 쉽습니다.

+3

광범위한 반영 없이는 불가능합니다. – Femaref

+0

[이 링크] (http://geekswithblogs.net/marcel/archive/2007/03/24/109722.aspx)를 보았습니까? –

+0

왜 동적 키워드를 사용하지 않습니까? –

답변

3

당신은 C 수 다른 방법으로 클래스를 재정의하고 생성자에게 dynamic 키워드를 사용하고 사용하려는 유형을 전달하십시오. 예를 들어

: 당신이 그것에 대해 생각하는 경우

class MyGeneralClass 
{ 
    dynamic myVariable; 
    Type type; 

    public MyGeneralClass(Type type) 
    { 
     this.type = type; 
     myVariable = Activator.CreateInstance(type); 
     //And then if your type is of a class you can use its methods  
     //e.g. myVariable.MyMethod(); 
    } 

    //If your function return something of type you can also use dynamic 
    public dynamic Function() 
    { 
     return Activator.CreateInstance(type); 
    } 
} 
+1

동적 유형이므로 유용합니다. 감사. –

4

MakeGenericType 메소드를 살펴보십시오. 이를 사용하여 런타임에 결정된 일반 인수 값을 사용하여 Type 인스턴스 (해당 유형의 인스턴스를 만드는 데 사용할 수 있음)를 생성 할 수 있습니다. 그러나 객체의 일반적인 기능을 다룰 때마다 더 많은 것을 반영해야합니다. 유형이 가변 유형 인수를 갖는 제네릭 유형 인 코드에서 변수를 작성할 수 없습니다.

1

난 당신의 코드에 대한 충분한 정보를 가지고 있지 않지만, 어쩌면 당신은 간단한 다형성을 사용할 수 있습니다 : 다른 클래스는 인스턴스화 할 책임이 될 수 있도록

public interface IMyInterface 
{ 
... 
} 

public class MyGenericClass<T> : IMyInterface 
{ 
.... 
} 

IMyInterface myClass = new MyGenericClass<typeNeeded>(); 

또한, 공장 디자인 패턴이 혼합 수 런타임 지식을 기반으로 유형의

이 과정은 가정 같은 방법이 나던 당신의 MyGenericClass :

public T GetT(){...} 

를하거나 그들 모두 공통의 슈퍼 클래스를 가질 수 있도록 모든 T'types 사이에 추가 관계가 않는 경우 BaseT 연결을 말할 수 당신은 변경할 수 있습니다

public T GetT(){...} 

에 :

public BaseT GetT(){...} 
+2

'typeNeeded'는 OP의 질문에있는 변수이므로,'new MyGenericClassy ()'는 컴파일되지 않습니다. –

+0

좋아, 좋은 지적이야. 어쨌든 T가 어떤 유형도 아니고 우리가 알고있는 몇 가지 유형 중 하나이며, (반사하지 않고) 간단하고 빠른 해결책이 필요하다는 것을 알게되면 switch를 사용하여 switch를 사용하여 인스턴스화하고이 해결책을 고수 할 수 있습니다. – 0lukasz0

+0

참. OP가이 길로 가고 싶어하고 더 많은 정보가 필요한지 보자. –

2

는 유형이 런타임에 결정되는 일반적인을 할 이유가 없습니다. Generics는 강력한 타이핑을 제공하지만 컴파일 타임에 유형을 알고있는 경우에만 가능합니다. 이것은 객체가 수행 할 수있는 작업을 알기 때문에 안전성을 제공하는 제네릭의 가장 큰 장점 중 하나입니다. 런타임에 어떤 유형인지 알지 못하면이 목적을 달성 할 수 없으므로 의 강력한 (하지만 때로는 위험한) 세계를 탐구해야합니다. 예를 들어, 내가 컴파일시에 유형을 알고 있기 때문에

List<DateTime> list = new List<DateTime>(); 
foreach (DateTime item in list) 
    item.Minute + ": " + item.Hour 

, 나는 일반 용기에 저장하고 그것을 사용할 때 형식 안전성을 가지고있다. 항목에 분과 시간 속성이 있음을 압니다.


개체가 어떤 유형인지에 따라 작업을 수행하려면 GetType() 메서드를 사용하십시오. 이것은 런타임 유형 식별 및 처리에 대한 귀하의 창입니다.

Result PerformQuery(object unknownObject) 
{ 
    switch (object.GetType()) 
    { 
     case typeof(ThisType): Do This; break; 
     case typeof(ThatType): Do That; break; 
    } 
} 

당신은 개체와 뭔가를하려는 경우 다음 중 당신이 인터페이스를 사용할 수 있다는 것을 의미 컴파일 타임에 방법 이름,

IFood hamburger = new Hamburger(); 
hamburger.BeEaten(); 

당신이 만약 알고 리플렉션이나 다이내믹을 사용할 수있는 인터페이스를 사용하지 않거나 사용하고 싶지 않은 경우이 메서드는 호출 할 메서드를 알고 있으면 동적으로 사용합니다. 당신은 당신이 반사를 사용하여 컴파일 타임에 호출 할 방법을 모르는 마지막 경우

Result PerformQuery(object unknownObject) 
{ 
    if (object.GetType() == typeof(Pizza)) 
    { 
     dynamic pizza = unknownObject; 
     pizza.BakeInOven() // since I checked and know it is type Pizza it is 'somewhat' safe to do this, unless Pizza class changes the name of BakeInOven method. 
    } 
} 

.

string methodName = CalculateWhatMethodShouldBe(); 
    MethodInfo myMethod = unknownObject.GetType().GetMethods().First(m => m.Name == methodName);  
    MethodInfo.Invoke(unknownObject); 
관련 문제