2016-07-29 1 views
1

검색 할 때 답을 찾지 못했습니다.C# 다른 클래스 목록

기본 클래스 BaseA에서 각각 고유 한 클래스가 포함 된 목록이 필요하지만 각각 다른 클래스에는없는 속성이 있거나 동일한 클래스를 사용하는 속성이 있습니다. 내가 클래스 AA, AB와 AC와 나는 단지 그들 중 하나와 함께 일하고 있어요 생각하지 않습니다 편집기를 포함 할 수있는 하나의 목록을 얻는 방법

public class BaseA 
{ 
    public int ID = 0; 
} 

public class AA : BaseA 
{ 
    public int AID = 0; 
} 

public class AB : BaseA 
{ 
    public int BID = 1; 
} 

public class AC : BaseA 
{ 
    public int CID = 0; 
} 

이제 질문입니다.

나는 List<BaseA>을 만들려고했으나 bassA 속성 만 보여주고, List[0].AID을 할 수있는 것이 필요하다. 내가 AA 클래스에 대해 말하고 있다면 AID의 의미를 이해할 것이다.

내가 잘못 될 수 있습니다, 누군가가 올바른 방향으로 나를 가리킬 수 있습니까?

+2

디자인 결함이있는 것 같습니다.한 걸음 뒤로 물러서서이 수업들에 대한 공유 목록을 가져야하는지 결정하십시오. – Default

+0

맞을 수도 있지만 그 수업들에 대한 공유 목록은 더 나은 해결책입니다. – ImtehQ

+0

그 단일 목록에서 데이터를 추출하는 9 가지 다른 방법이 필요한 경우가 아닐 수도 있습니다. – Default

답변

0

당신은이에 대한 Linq에를 사용하여 시도 할 수 있습니다 :

List<BaseA> list = ... 

    var result = list 
    .OfType<AA>() // Filter out AA instances only 
    .ElementAt(0) // or just First(); 
    .AID; 
0

당신이 캐스팅을 찾고 계십니까, 아마?

var list = new List<BaseA> 
{ 
    new AA(), 
    new AB(), 
    new AC(), 
} 

var aa = list[0] as AA; 

if (aa != null) 
{ 
    var id = aa.AID; 
} 
0

이 어떤 종류의 상점이 다음 캐스트를 시도 기본 클래스의 변수 또는 속성을 배치해야합니다 (목록 [0] AA 등), 그것이 null 사용을 반환하지 않는 경우 새로 주조 객체 원하는 변수를 선택하십시오.

진짜 질문은 파생 클래스가 자신의 ID 변수를 필요로하는 이유입니다. 특히 ID를 기반으로하는 목록에 던져 넣는 경우 더욱 그렇습니다.

+0

ID와 AID 또는 BID는 단지 예일뿐입니다.) – ImtehQ

0

간단하고 우아하게이 작업을 수행 할 수있는 방법이 있습니다.

public abstract void AID(parameters); 

그리고 각 클래스에서

해당 클래스에 관련된 특정 일을하는 메소드를 오버라이드 (override) : 추상베이스 클래스의 방법 (또는 그들 중 다수를) 제공합니다.

또는 다른 방법을 사용할 수 있습니다. 이 클래스의 각각의 유형의 경우 각 개체에 대해 확인 : 당신이 시도 할 수있는 방법의

if(obj is AA){ 
//do AA stuff 
} 
if(obj is AB){ 
//do AB stuff 
} 
if(obj is AC){ 
//do AC stuff 
} 
0

커플

  1. 당신의 접근 방식으로 가고, ((AA)List[0]).AID에 목록의 항목을 캐스팅.

당신은 그것의 재산 AID에 액세스하려면 AA에 속한 개체의 지식이 있어야합니다. 귀하의 요구 사항은 당신이 당신이이 방법을

class BaseA 
{ 
    public string ObjectType { get; set; } //enum would be a good choice. 

    public int ID { get; set; } 
      (or) 
    public Dictionary<string,int> AllProperties { get; set; } 
} 

아래에 제공 비슷한 라인에서 뭔가를 제안했다 다음 설명한 사용에 제한되어있는 경우

, 당신은 클래스의 유형을 확인하실 수 있습니다 그것에 대한 적절한 속성을 부르십시오.

+0

여러 번 캐스팅해야하기 때문에 캐스트가 작동하지 않습니다. 또한 열거 형 방법을 사용하여 일부 코드 전에 어떤 형식인지 알아 냈습니다.하지만 더 좋은 방법이 있어야한다고 생각했습니다. – ImtehQ