2011-09-01 3 views
0

좋은 날,제한된 속성 유형

나는 컬렉션을 나타내는 클래스가 있습니다. 컬렉션에는 각 요소의 메타 데이터 객체의 데이터 유형을 지정할 수있는 Type 유형의 속성이 있습니다. 요소가 콜렉션에 추가 될 때마다 지정된 메타 데이터 오브젝트의 새 인스턴스가 콜렉션 클래스에서 Activator.CreateInstance(Type type)으로 작성됩니다.

내가 필요한 것은 메타 데이터 개체의 형식을 특정 intreface를 구현하는 형식으로 제한하는 것입니다. 예 :

publlic class Collection 
{ 
    public Type MetaDataType; 

    // other code 
} 

public class CollectionImplementation 
{ 
    // some properties 

    public CollectionImplementation() 
    { 
     Collection c = new Collection(); 

     // valid assignment 
     c.MetaDataType = typeof(ValidMetaClass); 

     // invalid assignement 
     c.MetaDataType = typeof(InvalidMetaClass); 
    } 

    // some functions 
} 

public class ValidMetaClass : IMetaInterface 
{ 
    // valid meta class code 
} 

public class InvalidMetaClass 
{ 
    // invalid meta class code 
} 

public interface IMetaInterface 
{ 
    // interface code 
} 

이렇게 할 수 있습니까?

모든 참여자 께 미리 감사드립니다. 모든 입력에 감사드립니다.

종류와 관련, 나

+0

어떤 언어입니까? – user12345613

+0

그것은 C#입니다 - 내 CollectionImplementation 클래스 생성자의 서명이 잘못되어있는 것을 보았습니다 (이것이 왜 묻는 지 확실하지 않습니다) – that0th3rGuy

답변

1

제네릭을 사용하여 시도하고 컬렉션 클래스의 공용 필드 MetaDataType을 설정하는 대신 생성자에 제약을 입력합니다.

public CollectionImplementation<T>(T MetaDataType) where T : NameOfInterface 
{ 
} 
+0

당신과 Nabheet가 비슷한 솔루션을 제공하는 것을 보면서 두 사람에게 답하는 대신 자신의 게시물에 대한 내 의견을 참조하십시오. – that0th3rGuy

0

당신은 일반적인 유형에 대한 제한을 사용할 수 있습니다.

public class Collection<T> where T : IMetaInterface 
{ 
T MetaDataType; 
} 

또는 같은 요소를 추가 할 때 당신은 예외를 던질 수 :

if(!(addedElement is IMetaInterface)) throw new Exception("Please don't do this"); 
+0

도움을 주셔서 감사합니다. 나는 아직 제네릭 타입에 익숙하지 않다. 제네릭을 사용하여 다른 클래스를 사용했지만 내 자신을 사용하지 않습니다. 내 클래스는 사용자 지정 이벤트, 대리자 및 기타 개인 함수 몇 가지를 사용합니다. 제네릭을 사용하면 매개 변수로 전달되거나 다른 방식으로 참조 될 때 제네릭 형식이 전체 솔루션에 침투해야합니다. 문제가 아니기 때문에 새롭고 흥미로운 부분이 있습니다. 그렇다면 제네릭 유형에 대한 연구가 필요하며 아직 괴롭히지 않을 것입니다 ^^, 고맙습니다 – that0th3rGuy