2011-01-30 5 views
1

질문 통해 CollectionBase의 유형을 결정하는
확실 반사 또는 Microsoft.Cci를 사용 CollectionBase 유래의 유형에 포함 된 유형을 결정 고정 방법이 있는가?반사 (또는 Microsoft.Cci)

배경 :
나는 복사 유형, 사용자 정의 된 해당 유형의 버전 사이 컨버터를 만드는 코드 생성기에서 일하고 있습니다. Microsoft.Cci를 통해 원본 어셈블리의 형식을 처리합니다. 텍스트 템플릿을 사용하여 소스 코드를 인쇄합니다. 그것은 많은 변환과 커스터마이제이션을 수행하고, 내가 신경 쓰지 않는 코드를 던집니다.

결과 코드에서 이전에 CollectionBase, IEnumerable<T> 또는 T[]이 사용 된 모든 곳에서 List<T>을 대체하려고합니다. List<T>을 사용하고 싶습니다. 왜냐하면 저는 제 애플 리케이션에서 중요한 추가 작업없이 직렬화 할 수 있다고 확신하기 때문입니다. T은 모든 경우에 구체적입니다. 나는 사용자 정의 구현을 복사해야하기 때문에 CollectionBase 클래스를 복사하지 않으려 고합니다. 코드 생성기에서이를 수행하지 않으려합니다.

내가 문제가되는 부분은 CollectionBase을 바꿀 때 List<T>에 대해 T을 결정하는 것입니다. 지금까지했던 어떤

는 :
나는 간단히 CollectionBase에 대한 MSDN의 문서와 샘플을보고 있고, 그들은 당신의 파생 유형에 대한 사용자 정의 Add 방법을 만드는 언급. 나는 이것이 어떤 식 으로든 시행되고 있다고 생각하지 않는다. 그래서 나는 그것에 의지 할 수 있을지 확신하지 못한다. 구현자가 다른 이름을 지정할 수도 있고, 더 나쁜 경우 복수 유형을 지원하는 콜렉션을 가질 수도 있습니다 (Object은 유일한 조상 임). 내가
을 고려한

대안 :
아마 디폴트의 직렬화 내가 활용할 수있는 몇 가지 트릭을 수행합니다. CollectionBase 콜렉션의 기본 직렬화가 있습니까? 아니면 일반적으로 직접 구현해야합니까? 직접해야만하는 경우 유형을 결정하기 위해 볼 수있는 신뢰할 수있는 메타 데이터가 있습니까? 기본 직렬화를 지원하는 경우 컬렉션의 항목에 대한 런타임 유형에 의존합니까?

List<T>에 해당하는 T에 매핑 된 알려진 CollectionBase 유형의 코드 생성기에서 매핑을 만들 수 있습니다. 주어진 CollectionBase 유형이 목록에 없으면 예외가 발생합니다. 이것은 신뢰할 수있는 대안이 없다면 아마도 내가 갈 것입니다.

+0

왜 여기에'CollectionBase'가 관련되어 있습니까? 또한 어떤 버전의 Visual Studio를 타겟팅하고 있습니까? VS2008에서'Cci' 네임 스페이스가 어떻게 변경되었는지 http://msdn.microsoft.com/en-us/library/cc901387(VS.90).aspx에서 확인하십시오. –

+0

@ 존 : 3.5를 목표로하고 있습니다. 나는 2.0-ish 공개 소스를 codeplex에서 사용하고 있습니다. 'CollectionBase'는 소스 코드가 파생 된 타입을 가지고 있기 때문에 관련이 있습니다. 타겟 코드가'List '를 사용하기위한 프로퍼티와 메소드를 변경하기를 바랍니다.내 질문을 편집 했으니 이제는 중요한 세부 사항이 더 명확 해지기를 바랍니다 :) –

+0

@Merlyn : 어떤 종류의 직렬화가 걱정 되십니까? 'CollectionBase'에서 변경해야하는 문제는 보이지 않습니다. –

답변

0

저는 조언을하기 위해 당신이하고 싶은 일에 대해 아직 확실하지 않습니다. 그래도 CollectionBase 파생 클래스는 모두 Add (T)를 구현합니까? 그렇다면 객체가 아닌 다른 유형의 단일 매개 변수로 Add 메소드를 찾아 T에 해당 유형을 사용할 수 있습니다.

+0

아무런 보장이 없습니다, 그러나 단순히 알려진 유형을 매핑하는 유일한 대안처럼 보였습니다. 결국 내가 사용했던 것입니다. –