문제
수집할 수 있는 방법이 있나요(예:목록에서) 공통 슈퍼 클래스를 공유하지 않는 여러 '일반' 개체가 있습니까?그렇다면 공통 속성에 어떻게 액세스할 수 있나요?
예를 들어:
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가지 선택이 있습니다:그렇지 않으면 다양한 유형의 객체의 유사한 속성에 액세스할 수 없습니다.
가장 좋은 방법은 공통 기본 클래스를 추가하는 것입니다. 그렇지 않으면 리플렉션으로 돌아갈 수 있습니다.