2017-12-12 1 views
0

이론적으로 다양한 유형의 여러 일반 목록을 반환하여 클라이언트에게 다양한 정보를 제공 할 수 있어야하는 인터페이스를 만들었습니다.인터페이스를 통해 다른 유형의 목록에서 결과를 반환합니다. C#

인터페이스 클래스 : 나는 첫 컬렉션을 반환 할 경우에만 수있는 목록의 결과를 통해 루프를 시도 할 때, 당신은 제가 다음에서 결과를 반환해야하는 방법을 이해하는 데 도움이 될 수 있습니다

public interface IExampleInterface{} 

public class ExampleType : IExampleInterface 
{ 
    public int First; 
    public int Last; 
} 

public class ExampleAmount : IExampleInterface 
{ 
    public decimal Amount; 
    public decimal TotalFee; 
} 

public class ExampleFacts : IExampleInterface 
{ 
    public bool TooLow; 
    public bool TooHigh; 
} 

인터페이스 제공 :

foreach (dynamic item in ExampleResults(0)) 
{ 
    Response.Write(item.First.ToString()) 
    Response.Write(item.Last.ToString()) 
    //The first two for 'sT' read fine, it breaks here 
    Response.Write(item.Amount.ToString()) 
    //... And so on 
} 
: 나는 데이터를 반환하는 데 필요한 페이지

public class ExampleInterfaceProvider 
{ 
    private static readonly string conn = ConfigurationManager.ConnectionStrings["conn"].ConnectionString; 
    public static List<IExampleInterface> ExampleResults(int id) 
    { 
     //declare variables, read from database query using ExecuteReader... 
     var sT = new ExampleType 
     { 
      First = first; 
      Last = last; 
     } 
     var sA = new ExampleAmount 
     { 
      Amount = amount; 
      TotalFee = totalFee; 
     } 
     var sF = new ExampleFacts 
     { 
      TooHigh = tooHigh; 
      TooLow = tooLow; 
     } 
     var exampleResults = new List<IExampleInterface> {sT, sA, sF}; 
     return exampleResults; 
    } 
} 

어떤 도움이 많이 주시면 감사하겠습니다

,

감사

내가 생각
+1

각 요소를 적절한 형식 인 ExampleType, ExampleAmount 등으로 변환하거나 형식 변수에 따라 각 유형에 구현되는 메소드를 인터페이스에 제공해야합니다. 이 방법을 사용하면 목록의 모든 항목을 호출 할 수 있습니다. 또한 당신의 인터페이스가 있다면 왜'동적'을 사용합니까? 인터페이스를 타입 지정자로 사용할 수 있습니다 :'foreach (ExampleResults (0)의 IExampleInterface item) ' –

+1

오류 메시지 란 무엇입니까? – keith

+1

왜 처음에는 빈 인터페이스를 구현합니까? 인터페이스는 데이터 유형과 호출 코드 (여기서는 for 루프) 사이에서 계약을 설정하기 위해 작성되었습니다. 그렇지 않으면 인터페이스가 쓸모 없게 인터페이스를 설계해야합니다. 그렇지 않으면 인터페이스가 쓸모 없게됩니다. 개체'귀하의 컬렉션 –

답변

2

, 더는 구현을 비교 제외한 다른 해결책은 없다; 당신은 C# 7을 사용하는 경우

 foreach (IExampleInterface item in ExampleResults(0)) 
     { 
      if (item is ExampleType) 
      { 
       var exampleType = (ExampleType)item; 
       Response.Write(exampleType.First.ToString()) 
       Response.Write(exampleType.Last.ToString()) 
      } 
      else if (item is ExampleAmount) 
      { 
       var exampleAmount = (ExampleAmount)item; 
       Response.Write(exampleAmount.Amount.ToString()) 
      } 
      //... And so on 
     } 

, 당신은 당신은 documentation을 찾을 수 있습니다 switch case

 foreach (IExampleInterface item in ExampleResults(0)) 
     { 
      switch (item) 
      { 
       case ExampleType c: 
        Response.Write(c.First.ToString()); 
        Response.Write(c.Last.ToString()); 
        break; 
       case ExampleAmount c: 
        Response.Write(c.Amount.ToString()); 
        break; 
       default: 
        break; 
      } 
      //... And so on 
     } 

로 수행 할 수 있습니다.

1

기본적으로 을 구현하는 항목은 모두 인터페이스를 구현하는 실제 유형에 특정한 방식으로 Response에 작성해야합니다.

다음 방법에 대해이 :

public interface IExampleInterface 
{ 
    void WriteTo(Response response); 
} 

public class ExampleType : IExampleInterface 
{ 
    public int First; 
    public int Last; 

    public void WriteTo(Response response) 
    { 
     response.Write(First.ToString()); 
     response.Write(Last.ToString()); 
    } 
} 

public class ExampleAmount : IExampleInterface 
{ 
    public decimal Amount; 
    public decimal TotalFee; 

    public void WriteTo(Response response) 
    { 
     response.Write(Amount.ToString()); 
     response.Write(TotalFee.ToString()); 
    } 
} 

public class ExampleFacts : IExampleInterface 
{ 
    public bool TooLow; 
    public bool TooHigh; 

    public void WriteTo(Response response) 
    { 
     response.Write(TooLow.ToString()); 
     response.Write(TooHigh.ToString()); 
    } 
} 

: 그리고

foreach (IExampleInterface item in ExampleResults(0)) 
{ 
    item.WriteTo(Response); 
} 

Response는 응답보다는 정적 클래스의 인스턴스를 보유하는 변수라고 가정.

관련 문제