문제

수집할 수 있는 방법이 있나요(예:목록에서) 공통 슈퍼 클래스를 공유하지 않는 여러 '일반' 개체가 있습니까?그렇다면 공통 속성에 어떻게 액세스할 수 있나요?

예를 들어:

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 속성에 액세스할 필요가 없습니다(유형이 안전하지 않기 때문).

편집하다: 이제 이것에 대해 생각해 보았는데, 이를 위해 하위 클래스를 사용하는 것이 가능할 것입니다.하지만 이는 새로운 유형마다 새로운 하위 클래스를 작성해야 한다는 의미라고 생각합니다.


@그르제니오네, 제 질문에 정확히 답이 됐어요.물론, 이제는 공유 인터페이스 전체를 복제해야 하지만, 그건 큰 문제가 아니다.그렇게 생각했어야 했는데...

@아쿠오리 타이핑에 대한 당신 말이 맞습니다.나는 완전히 임의의 두 가지 유형의 객체에 액세스할 수 있을 것이라고 기대하지 않습니다.

그러나 나는 일반 객체가 매개변수화되는 유형을 제외하고는 완전히 동일하기 때문에 일종의 공통 인터페이스를 공유할 것이라고 생각했습니다.분명히 이것은 자동으로 발생하지 않습니다.

도움이 되었습니까?

해결책

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);

귀하의 질문에 대한 답변이 되었나요?

다른 팁

C#에서는 덕 타이핑을 지원하지 않습니다.2가지 선택이 있습니다:그렇지 않으면 다양한 유형의 객체의 유사한 속성에 액세스할 수 없습니다.

가장 좋은 방법은 공통 기본 클래스를 추가하는 것입니다. 그렇지 않으면 리플렉션으로 돌아갈 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top