2011-07-04 2 views
3

코드가 있습니다.캐스팅 관련 문제

myDataGrid은 메소드에 전달 된 객체입니다. 나는 그것이 다른 유형의 OvserveableCollection 유형이라는 것을 알고있다. 내가 필요로하는 모든 OvserveableCollection<T>에 해당 개체를 캐스팅하는 것입니다 (그것은 IEnumerable 인터페이스를 구현)

//get element's type 
Type entryType = (myDataGrid as IEnumerable).AsQueryable().ElementType; 

foreach (var item in (IEnumerable<entryType>)myDataGrid) 
{} 

하지만 컴파일러는 루프 헤더에 entryType를 알 수 없습니다. 왜 ?

답변

5

리플렉션 (MakeGenericMethod()/MakeGenericType())을 사용하지 않으면 런타임 Type 인스턴스를 제네릭 형식 매개 변수로 사용할 수 없습니다. 그러나 어쨌든 그것이 도움이 될지 의심 스럽다! 이 시나리오에서는 API가 아닌 IEnumerable (<T>은 아님) API를 사용하거나 알려진 인터페이스/하위 클래스로 캐스팅하거나 dynamic을 최후의 수단으로 입력해야합니다.

MakeGenericMethod() 등을 사용합니다. 그러나 더 복잡하고 거의 확실하게 느립니다. 예를 들어

:

foreach(object item in (IEnumerable)myDataGrid) 
{ 
    // tada! 
} 

일반 코드를 호출 할 dynamic를 사용하는 또 다른 트릭은 다음과 같습니다

public void Iterate<T>(IEnumerable<T> data) 
{ 
    foreach(T item in data) {...} 
} 
... 
dynamic evil = myDataGrid; 
Iterate(evil); 
+0

새로운 '동적'유형에 대해 알지 못했습니다. 그리고, 네, 그것은 악마이기 때문에 나는 그것을 좋아할 것이라고 생각합니다. 일단 스크립트 - 토끼, 항상 해커. 물고기를 주셔서 감사합니다 ;-) – corlettk

4

Type변수을 제네릭 형식의 형식 인수로 사용하려고합니다. 제네릭은 그런 식으로 작동하지 않습니다. 타입 인자로 컴파일 타임 타입을 사용해야합니다. (컴파일 타임 타입은 일반적인 메소드에서 이것을 수행하는 경우 유형 매개 변수 자체 일 수 있습니다.)

요구 사항에 대해 더 많이 알지 못해도 코드를 변경하는 방법을 알기가 어렵습니다. 너는 그 물건들과 관련이 있니?

+0

ObserveableCollection을 반복하여 각 요소의 데이터를 읽어야합니다. – Tony

+1

@ 토니 : '객체'처럼 할 수 있습니다 - 왜 더 구체적인 컴파일 타임 유형이 필요합니까? –

1

당신은 위해 "실행시의 형태"... 캐스팅 수 없습니다 해당 캐스트를 실제로 구현하는 명령어를 "작성"하려면 컴파일러에서 Type ...이 필요합니다. 이는 실제로 유형이 COMPILE 시간에 알려 져야 함을 의미합니다.

이 제한 사항을 발견 한 유일한 방법은 캐스트를 수행하기 위해 IL 명령어를 "수동으로"생성하는 코드 생성기 (한 종류 또는 다른 종류의 코드 생성기)였습니다. 실제 요구 사항 (및 제약 조건)에 대해 많이 알지 못하면 무엇을 추천해야하는지 알기가 어렵습니다.

건배. 키이스.

+0

내 대답에'반복 (사악한)'을 좀 봐 ... 좀 더 쉽게 ... –

+0

예 ... 불행히도 나는 바쁜 3.5, coz 4.0 우리의 애플 리케이션을 업그레이 드 해요 우리가 광기의이 라운드를 시작할 때 밖으로. .. 한숨. – corlettk