2008-09-09 4 views
2

공통 수퍼 클래스를 공유하지 않는 여러 '일반'객체를 List (예 : List)에서 수집하는 방법이 있습니까? 그렇다면 공통 속성에 어떻게 액세스 할 수 있습니까? 예를 들어일반 객체의 일반이 아닌 멤버에 액세스

:

는 물론, 이것은 의사 코드는
class MyObject<T> 
{ 
    public T Value { get; set; } 
    public string Name { get; set; } 

    public MyObject(string name, T value) 
    { 
     Name = name; 
     Value = value; 
    } 
} 

var fst = new MyObject<int>("fst", 42); 
var snd = new MyObject<bool>("snd", true); 

List<MyObject<?>> list = new List<MyObject<?>>(){fst, snd}; 

foreach (MyObject<?> o in list) 
    Console.WriteLine(o.Name); 

,이 작동하지 않습니다.

또한 .Value 속성에 액세스 할 필요가 없습니다 (형식 유지가되지 않으므로).

편집 : 이제 이것에 대해 생각해 봤는데, 이것에 하위 클래스를 사용할 수 있습니다. 그러나, 나는 모든 새로운 타입에 대해 새로운 서브 클래스를 작성해야한다는 것을 의미한다고 생각한다.


Grzenio @ 네, 정확히 내 질문에 대답있다. 물론 지금은 전체 공유 인터페이스를 복제해야하지만 큰 문제는 아닙니다. 나는 그걸 생각해 봤어야했는데 ..

@aku 당신은 오리 타이핑에 관한 권리가 있습니다. 두 개의 완전히 무작위적인 유형의 객체가 액세스 가능할 것으로 기대하지는 않습니다.

그러나 일반 객체가 일종의 공통 인터페이스를 공유한다고 생각했습니다. 매개 변수가있는 유형을 제외하고는 똑같은 인터페이스를 사용하기 때문입니다. 분명히 이것은 자동으로 해당되지 않습니다.

답변

6

MyObject는 MyObject의 기본 클래스가 아니기 때문에 C#에서는 가능하지 않다고 생각합니다. 내가 일반적으로하는 일은 인터페이스 (일반적인 것이 아닌 '보통'인터페이스)를 정의하고 MyObject가 그 인터페이스를 구현하도록 만드는 것이다.

interface INamedObject 
{ 
    string Name {get;} 
} 

다음은 인터페이스를 사용할 수 있습니다

List<INamedObject> list = new List<INamedObject>(){fst, snd}; 

foreach (INamedObject o in list) 
    Console.WriteLine(o.Name); 

그것은 귀하의 질문에 대답 했을?

3

C#은 오리 입력을 지원하지 않습니다. 인터페이스와 상속이라는 두 가지 선택 사항이 있습니다. 그렇지 않으면 서로 다른 유형의 객체의 유사한 속성에 액세스 할 수 없습니다.

0

가장 좋은 방법은 일반적인 기본 클래스를 추가하는 것입니다. 그렇지 않으면 리플렉션으로 되돌릴 수 있습니다.

관련 문제