2014-10-20 3 views
0

내 영어 Miseables 죄송합니다.C에서 문자열에서 일반 T #

나는 XML 파일에서 2 개의 값을 가지며 리턴 값 T로 이어지는 일반적인 메소드가 필요하다. 하나의 XML 값은이 유형이지만,이를 유형으로 어떻게 사용할 수 있습니까?

예 :

var dataType = xml.Element("type").Value; 
var modelList = await Mapper<dataType>(serviceXml, myNamespace, objType, serviceJson.ToString()); 
+0

'Type.GetType()'을 사용하여 문자열에서'Type'을 얻을 수는 있지만, 컴파일 할 때 알아야 할 * 유형 매개 변수로 사용할 방법이 없다고 생각합니다. -시각. 'Mapper()'는 대신에'Type' 타입의 메서드 매개 변수를 받아들이는 오버로드를 가지고 있습니까? (또는 할 수 있습니까?) – David

+0

대부분의 맵퍼는 .GetType() 메서드를 사용할 수있는 매개 변수로 형식을받을 수 있습니다 – Amorphis

+0

@David ... 사실이 아니기 때문에 리플렉션을 사용하여 일반 호출을 만들 수 있습니다 (예 : http : /) /stackoverflow.com/questions/232535/how-to-use-reflection-to-call-generic-method –

답변

0

당신은 문자열을 사용 정적 GetType 방법을 사용하고이

Type.GetType("System.Collections.Generic.Dictionary`2[System.String,[MyType,MyAssembly]]") 

을 발견 할 수있는 경우 캐릭터 라인이 나타내는 유형을 찾을 수없는 경우 타입을 반환 할 수 있습니다 , 반환 할 것입니다 null

유형을 얻은 후에는 반사를 통해 매퍼를 사용할 수 있습니다. 매퍼가 방법이면 다음을 사용하십시오. 다음과 같습니다

MethodInfo method = this.GetType().GetMethod("Mapper"); // this.GetType works if you aren't in a static method 
MethodInfo generic = method.MakeGenericMethod(Type.GetType("theXmlValue")); 
generic.Invoke(this, new object[] {/* your parameters to the Mapper method */}); 
+0

하지만 ... 매퍼는 메서드가 'Type- 매개 변수 (비 - 일반) –

+1

@AndreasNiedermair 메서드를 제공해야합니다. 그러면 매퍼는 클래스를 generic으로 만들어서 리플렉션에 의해 호출되어야합니다. 어쨌든 형식이 필요합니다. . – samy

+0

?? ... 제네릭 호출을 만들기 위해 비표준 과부하 또는 리플렉션을 사용하는 것에 대한 힌트를 제공하여 답변을 향상시켜야합니다. 현재이 대답은 길의 절반에 불과합니다 ...btw 난 downvoter 아니에요;) –

0

일반 변수에서 매개 변수로 변수를 사용할 수 없습니다. 유형은 컴파일시 알려 져야합니다. 리플렉션을 통해 MakeGenericMethod 호출을 사용하여 만든 메서드를 호출하여이 작업을 수행 할 수 있습니다. 나는 이런 식으로 보일 것이라고 생각 :

var method = Mapper.GetType().GetMethod("DoesEntityExist") 
         .MakeGenericMethod(new Type[] { dataType }); 
method.Invoke(this, new object[] { serviceXml, myNamespace, objType, serviceJson.ToString() }); 

은 당신이 할 수있는 것은 인터페이스 또는 기본 클래스를 생성하고 변환을 처리 할 수있는 확장 메서드를 만드는 것입니다.

1
Type.GetType와

1) 부하 유형 일반적인 매퍼를 만들 수

2)를 사용하여 반사, 즉 대해서 typeof (매퍼 <에게>). CreateGenericType (dataType와)

3) 사용 Activator.CreateInstance로는 인스턴스를 생성 할 수 generic Mapper