2014-10-07 1 views
0

문제를 해결해 주시겠습니까?일반 클래스에서 "Type"개체를 반환하는 메서드를 실행하는 방법

public class GenericClass<T> 
{ 
    public static T Method(string xml) 
    { 
     ... 
    } 
} 

내가하고 싶은 것은 : 내가 GenericClass here 초기화 할 수있는 방법을 찾았지만, 한

public void do(Type _type) 
{ 
    var genObj = new GenericClass<_type>(); // Error 
    var result = genObj.Method("parameter"); 
} 

정말 어떻게 모르는 나는 초기화하고 이러한 클래스를 사용하려면 초기화에 사용 된 유형을 반환하는이 인스턴스의 메소드를 실행합니다.

+0

_type을 T로 바인딩하는'MakeGenericType'을 관찰하고 구체화 된 제네릭 클래스 정의를 "유형"으로 반환합니다. 그런 다음 Activator.CreateInstance는 모든 유형과 마찬가지로 트릭을 수행합니다. – quetzalcoatl

+0

후속 질문이 될 수도 있습니다.이 솔루션으로 해결하려는 문제는 무엇입니까? –

+0

일반 클래스를 만드는 방법을 찾았지만 메서드를 실행하고 결과를 얻는 방법을 모르겠습니다. 결과는 클래스 생성에 사용하는 것과 동일한 유형이어야합니다. – belurd

답변

1

리플렉션을 사용하여 GenericClass<T>의 동적 인스턴스를 만드는 방법을 실제로 묻는 것입니다. 이것은 어떻게 작동 :

var genericTypeDefinition = typeof(GenericClass<>); 
var concreteType = genericTypeDefinition.MakeGenericType(_type); 
var instance = Activator.CreateInstance(concreteType); // Calls default constructor. 

일부 instance.Method()를 호출 할 경우 (CreateInstance 단순히 객체를 반환하기 때문에)보다 특정 유형의 인스턴스를 캐스팅해야합니다. 다음

interface ISomeInterface 
{ 
    object Method(string xml); 
} 

class GenericClass<T> : ISomeInterface 
{ 
    void object ISomeInterface.Method(string xml) 
    { 
     return Method(xml); 
    } 

    public T Method(string xml) 
    { 
    } 
} 

과 :

난 당신이 안전하게 런타임에이 인터페이스로 캐스팅하고 원하는 메소드를 호출 할 수 있도록,이 인터페이스를 구현하는이 방법을 정의하는 인터페이스를 정의하는 GenericClass<>을 가지고 제안
var genericTypeDefinition = typeof(GenericClass<>); 
var concreteType = genericTypeDefinition.MakeGenericType(_type); 
var instance = (ISomeInterface) Activator.CreateInstance(concreteType); // Calls default constructor. 

instance.Method("parameter"); 
+0

메서드는 T 유형의 결과를 반환해야합니다. 경우에 따라 일반 인터페이스가됩니다. T 메서드 (문자열) – belurd

+1

네, 저에게 일어났습니다. 그것을 바꿨습니다. –