2013-07-30 3 views
1

현재 Excel 파일에서 측정 된 데이터를 읽고 개체에 구문 분석하고 데이터베이스에 삽입 할 수있는 가능성을 제공하는 C# 프로그램을 작성 중입니다.이 btw에 대해 NHibernate를 사용하고 있습니다.C#에서 제네릭을 사용하여 다형성 실현

프로그램에는 GUI 구현이 있습니다. 다양한 형태의 측정 데이터가 있습니다. (예 : 모터의 데이터 또는 스위치 보드의 데이터). 사실, 측정 데이터가 무엇이든 관계없이 하나의 Form 클래스 (GUI 창)를 정의하고자합니다.

두 개의 파서 인 MotorParser 및 SwitchboardParser는 모두 이라는 메서드를 가지고 있습니다. IList ParseDataTableToList (DataTable dataTable, DBConnectionWrapper dBCon) 여기서 T는 Motor 개체 또는 Switchboard 개체입니다. 그래서, 내 생각은이 두 클래스에 의해 구현 될 것이다 제네릭과의 인터페이스를 만드는 것이 었습니다 : 한편

public interface IParser<T> 
{ 
    IList<T> ParseDataTableToList(DataTable dataTable, DBConnectionWrapper dBCon); 
} 

, 내가하는 방법 무효 InsertOrUpdate (T 목록)를 구현 데이터베이스 저장소를 가지고 수행을, 여기에서 T는 다시 Motor 또는 Switchboard 개체입니다. 나는이에 대한 인터페이스를 구현 한 :

public interface IInsertOrUpdateList<T> 
{ 
    void InsertOrUpdate(IList<T> list); 
} 

좋아을, 아이디어는 이제 특정 IInsertOrUpdateList 개체 (MotorRepository 또는 SwitchboardRepository)와 IParser (MotorParser 또는 SwitchboardParser) 모두를 전달하는 것입니다. 앞에서 언급 한 Form 클래스 (ImportView)는 해당 인터페이스에서만 작동해야합니다. 문제는 제네릭으로 작업 할 때 이것이 가능한지 또는 어떻게 가능할 지 모르겠다는 것입니다. 나는이 창을 인스턴스화 할 때

public partial class ImportView : Form 
{ 
    private IParser parser; 
    private IInsertOrUpdateList repository; 
    private dataToParse; 

    public ImportView(DataTable dataToParse, IParser parser, IInsertOrUpdateList repository) 
    { 
     this.parser = parser; 
     this.repository = repository; 
     this.dataToParse = dataToParse; 
    } 

    public void ParseAndInsertIntoDB() 
    { 
     repository.InsertOrUpdateList(parser.ParseDataTableToList(dataToParse, null)); 
    } 
} 

, 나는이 모터 또는 배전반 객체에 대한 데이터를 측정 여부를 결정 개체를 제공 할 것이다 :

이 내가 마음에 구현했다 방법의 잘못된 구문은

ImportView = new ImportView(dataToParse, new MotorParser(), new MotorRepository()); 

또는

ImportView = new ImportView(dataToParse, new SwitchboardParser(), new SwitchboardRepository()); 

는 방법이 어떻게 제네릭 문제를 깨달을 수 있습니까? 나는 모든 종류의 아이디어에 열려 있습니다.

+0

이미 가지고있는 것에는 무엇이 문제가 있습니까? 나에게 그것을 할 수있는 좋은 방법처럼 보입니다. Factory 패턴을 사용하여'ImportView'를 생성하십시오. – Belogix

+1

구문을 수정하려면'ImportView' 클래스를 generic으로 만들어야합니다 :'ImportView '그리고'IParser '과'IInsertOrUpdateList '타입을 사용하십시오. 비록 그것이 컴파일을하기에 충분하다면 ... –

답변

1

이 같은 제네릭이를 달성 할 수 있습니다 :

첫째, 당신이 당신의 파서와 저장소에 대한 일반 클래스를 만들려면 :

  public class Parser<T> : IParser<T> 
      { 
       IList<T> ParseDataTableToList(DataTable dataTable, object o) 
       { 
        var list = new List<T>(); 
    //Your parsing logic can go: 
    //1) Here(using reflection, for example) or 
    //2) in the constructor for Motor/Switchboard object, 
    //in witch case they will take a reader or row object 
        return list; 
       } 
      } 
      public class Repo<T> : IInsertOrUpdateList<T> 
      { 
       void InsertOrUpdate(IList<T> list) 
       { 
        //... 
       } 
      } 

그리고 다음을, 당신의 일반 창 클래스는 다음과 같습니다 :

public partial class ImportView<T> : Form 
{ 
    private IParser<T> parser; 
    private IInsertOrUpdateList<T> repository; 
    private DataTable dataToParse; 

    public ImportView(DataTable dataToParse) 
    { 
     this.parser = new Parser<T>(); 
     this.repository = new Repo<T>(); 
     this.dataToParse = dataToParse; 
    } 

    public void ParseAndInsertIntoDB() 
    { 
     repository.InsertOrUpdate(parser.ParseDataTableToList(dataToParse, null)); 
    } 
} 

그리고 당신은 다음과 같이 인스턴스화 :

var ImportView = new ImportView<Motor>(YourDataTable) 
관련 문제