2010-03-22 3 views
5

에 캐스트 캐스트 약간의 리플렉션을 시도하고 결과 개체를 IList로 캐스팅하는 방법에 대한 질문이 있습니다. 여기 C# - 개체를 IList 을 기반으로 Type

은 반영 :

private void LoadBars(Type barType) 
{ 
    // foo has a method that returns bars 
    Type foo = typeof(Foo); 

    MethodInfo method = foo.GetMethod("GetBars") 
     .MakeGenericMethod(bar); 

    object obj = method.Invoke(foo, new object[] { /* arguments here */ }); 
    // how can we cast obj to an IList<Type> - barType 
} 

어떻게 우리가 barType 인수에서 형식의 IList의에 method.Invoke의 결과를 캐스팅 할 수 있습니까?

답변

5

캐스트의 요점은 컴파일러에게 컴파일 타임에 뭔가를 알고 있다는 것을 알리는 것입니다. 컴파일 시간은입니다. 여기서 정보를 알지 못합니다 - 실행 시간이 인 에서만 알 수 있습니다.

캐스팅 한 후 값으로 무엇을 기대합니까? 틀림없이 유형 매개 변수가 필요없는 멤버 (예 : Count, IList<T>)에 도착하려는 경우에도 일반 인터페이스를 사용해야하는 경우 유용 할 때 번이 번 있습니다. 그러나 그것이 당신이하려는 일이 아니라면, 당신이 더 많은 정보를 줄 수 있다면 정말 도움이 될 것입니다.

+0

목록을 캐스트 된 유형으로 반복하려고합니다. 나는 어떤 의미가 없다는 것을 인정한다. 우리는 컴파일러에게 필요한 것을 생성하기 위해 타입을 알려줄 필요가있다. 문제의 목표는 LOB 불규칙성을 둘러싼 해킹 인 엣지 케이스를 탐구하는 것이 었습니다. 문제를 명확하게 제시해 주셔서 감사합니다. – blu

0

.NET 4.0에서는 표현식 트리를 사용하여 표현식 트리를 사용할 수 있습니다.

0
private void LoadBars<T>() 
{ 
    Type barType = typeof(T); 
    // foo has a method that returns bars 
    Type foo = typeof(Foo); 

    MethodInfo method = foo.GetMethod("GetBars") 
     .MakeGenericMethod(bar); 

    IList<T> obj = (IList<T>)method.Invoke(foo, new object[] { /* arguments here */ }); 
} 
+1

정확히는 T가 컴파일 타임에 알려 져야합니다. – Radu094

0

주조는 의미를 만드는 것이 컴파일시에 barType 새로운 함수의 호출, 그리고는 런타임을 경우. 난 그냥이 문제와 씨름 마친

private IList<T> LoadBars<T>() 
{ 
... 
return obj as IList<T>; 
} 
4

: 그건 사실이되면, 당신은 단지에 기능을 템플릿 수 있습니다.
사실, 개체를 일반 IList로 캐스팅 할 수는 없지만 List 개체의 "ToArray"메서드를 호출하여 강력하게 형식화 된 Array로 변환 할 수 있습니다.

다른 블로그에서 해결할 수 있습니다. http://amazedsaint.blogspot.com/2008/04/creating-generic-list-at-runtime.html

ToArrayMethod = obj.GetType(). GetMethod ("ToArray");

System.Array stronglyTypedArray = (System.Array) ToArrayMethod.Invoke (obj, null);

관련 문제