2012-07-04 2 views
0

큰 사전 (문자열, 개체)이 있습니다. 사전의 값은 다른 유형입니다. 런타임에만 (string, int) 또는 (string, string) 사전에 정확한 값 유형을 찾을 수 있습니다. 런타임에 사전에 값을 해당 강하게 입력 된 객체에 할당해야합니다. 이것은 단순화 된 문제입니다. 캐스트를 수행하는 입력 된 클래스를 사용하려고합니다. 나는 작동하지 않는 코드가 있습니다반사 및 출력 매개 변수를 사용하여 일반 캐스트를 수행하는 방법

static void Main(string[] args) 
{ 
    var values = new Dictionary<string, object> 
    { 
     { "123", "test"}, 
     {"12", 123} 
    }; 
    var result = new Dictionary<string, object>(); 

    Type dict = values.GetType(); 
    Type typedCast = typeof(TypedClass<>).MakeGenericType(new [] { dict }); 
    MethodInfo method = typedCast.GetMethod("GetTypedValue", 
     BindingFlags.Static | BindingFlags.Public, 
     null, 
     new[] 
      { 
        typeof(object), 
        typeof(object).MakeByRefType() 
      }, 
     null); 

    method.Invoke(null, new[]{values, result}); 
} 

public class TypedClass<T> 
{ 
    public static void GetTypedValue(object value, out object obj) 
    { 
     obj = (T)Convert.ChangeType(value, typeof(T)); 
    } 
} 

을 내가 올바른 유형과 OBJ 값을 참조 GetTypedValue 방법 내부를하지만,이 방법 밖에 밖으로 변수에 값이 없습니다. 내가 뭘 잘못하고 있는지 알려줘.

+0

'string'과'int' 값의 조합으로 채워진'Dictionary '를 주어, 하나의'과 두 개의 사전을 만들어 내고 해당 값으로 채워지는 다른 '' 유형별로 일치합니까? 그래서 당신의 샘플 코드에서'{ "123", "test"}'와'{ "12", 123}'을 포함하는 두 번째 사전을 포함하는 하나의 사전 결과를 얻게됩니까? –

+0

나는 이것이 http://stackoverflow.com/questions/569249/methodinfo-invoke-with-out-parameter의 사본이라고 생각한다. method.Invoke에 전달 된 배열을 변수에 저장하고 그 결과를 검색해야합니다. –

답변

0

에 한번 교체 : 그 때문에

method.Invoke(null, new[]{values, result}); 

var invokeArgs = new[]{values, result}; 
method.Invoke(null, invokeArgs); 
//here you can check the invokeArgs[1] for the actual result of the conversion 

어떤 경우에, 나는, 다른 사전에 사전의 형식을 변환 할 이유를 모르겠어요 무엇을 당신을 코드가 수행하는 것 같습니다 ...

+0

감사합니다. 문제가 해결되었습니다. 나는 일반적인 방식으로 약 100 가지의 다른 유형의 사전을 처리하려고 시도하고 있지만 그 결과를 형식화 된 결과로 반환하여 이전 변수에 저장합니다. – Monica

0

out 개체 obj 인수의 형식을 out to obj로 변경하십시오.

관련 문제