2011-04-18 5 views
2

원래 질문은 기본적으로 Constrain type to specific types과 동일 할 것입니다.공개 속성을 목록의 특정 유형으로 제한 <Type>

내가 성취하고자하는 것은 기본적으로 이것입니다.

위의 질문을 읽고 나면 분명히 불가능합니다.

컨텍스트에 대한 아이디어를 얻으려면 여러 유형 (특정 인터페이스를 구현할 경우)을 지원하도록 설계된 파서를 작성 중이지만 구문 분석 할 수있는 데이터 유형에 대한 컴파일 유형 가정을 작성하지 마십시오. 지원되는 유형의 목록이 제공되고 나머지는 자동으로 처리 할 수 ​​있어야합니다.

기본적으로 내가 궁금해하는 것은 이러한 속성 (존재하는 경우)에 대한 대안 (속성이 설정된 경우 런타임 유형 검사 외에)이 무엇인가하는 것입니다.

편집 : 제안 된 해결책이 작동하지 않는 것 같습니다. 내가 코드와 끝까지

은 다음과 같습니다이 :

public class CustomSerializableTypeList<T> : List<T> where T : ITcpSerializable 
{ 

} 

CustomSerializableTypeList<Type> myCustomTypes = new CustomSerializableTypeList<Type>(); 

그리고 다음과 같은 오류가 나타납니다

The type 'System.Type' cannot be used as type parameter 'T' in the generic type or method 'CustomSerializableTypeList'. There is no implicit reference conversion from 'System.Type' to 'ITcpSerializable'.

오류가 한 번 나가보고 제네릭 구현에 대해 생각 완벽한 의미가 있습니다를 그 제안되었습니다.

이 문제를 해결하는 방법이 있어야합니다.

+0

어떤 공공 목록에 대해 MyPublicProperty {얻을; 세트; } – MattDavey

+0

참고 : 특정 유형을 구현하는 인스턴스의 List를 제공하지 않을 것입니다. 특정 인터페이스를 구현하는 List of * Types *을 제공하고자합니다. –

답변

3

나는 당신이 List<Type>을 래핑하는 것입니다 자신의리스트의 구현을 필요 생각한다. 이 같은 아마 뭔가 : 당신은 아마 IList<Type>을 구현하고자하고 단순히 list에 방법을 위임 할 물론

public class TypeList<T> where T : class 
{ 
    private readonly List<Type> list = new List<Type>(); 

    public void Add(Type item) 
    { 
     if(!typeof(T).IsAssignableFrom(item)) 
     { 
      throw new InvalidOperationException(); 
     } 

     list.Add(item); 
    } 
} 

.

1

당신은 List<T>에서 유래와 종류의 제약 조건을 추가 새 컬렉션 유형 CustomList<T>을 정의하고 클래스에 List<Type> 대신이를 사용할 수 있습니다.

public class CustomList<T> : List<T> where T : ICustomInterface { 
    ... 
} 
1

Please note: I am not looking to provide a List OF instances that implement a specific type. I am looking to provide a List OF Types that implement a specific interface.

쉬운 방법은 없습니다. 당신은 ... 자신의 컬렉션 클래스를 구현하는 추가 메소드를 오버라이드 (override) 다음 유형의 반사를 통해 인터페이스를 구현하는지 확인해야합니다

class myTypeCollection : List<System.Type> 
{ 
    override void Add(Type t) 
    { 
     if (t.GetInterface(typeof(MyCustomInterface)) == null) 
      throw new InvalidOperationException("Type does not implement MyCustomInterface"); 

     base.Add(t); 
    } 
} 
관련 문제