2016-06-23 8 views
3

나는이 질문에별로 의의가 없다고 생각한다. 분명히 제네릭 형식 부분 밖에서 나왔고 나머지를 테스트하여 기능을 확인해야했기 때문에 Google에서 올바른 용어를 사용하지 않습니다. 내가 알고있는 데이터의 일부를 조작하는C# 재사용을위한보다 일반적인 방법을 만드는 것이 더 좋은 방법일까요?

private void SaveList<T>(List<T> lst, string file) 
    { 
     XmlSerializer xml = new XmlSerializer(typeof(List<T>)); 
     try 
     { 
      using (StreamWriter sw = new StreamWriter(file)) 
      { 
       xml.Serialize(sw, lst); 
      } 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show("Failed to update local hardware XML.\n" + ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); 
     } 
    } 

 private List<T> LoadList<T>(List<T> lst, string file) 
    { 
     // don't bother if the file does not exist. 
     if (File.Exists(file)) 
     { 
      // straight forward 
      XmlSerializer xml = new XmlSerializer(typeof(List<T>)); 
      try 
      { 
       using (StreamReader sr = new StreamReader(file)) 
       { 
        return (List<T>)xml.Deserialize(sr); 
       } 
      } 
      catch 
      { 
       MessageBox.Show("Failed to load local hardware XML.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); 
      } 
     } 

     return new List<T>(); 
    } 

그리고 다른 약간의 일반적인 변형이에

private void SaveHw() 
    { 
     XmlSerializer xml = new XmlSerializer(typeof(List<Hardware>)); 
     try 
     { 
      using (StreamWriter sw = new StreamWriter(fileHw)) 
      { 
       xml.Serialize(sw, lstHw); 
      } 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show("Failed to update local hardware XML.\n" + ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); 
     } 
    } 

:

나는 다음과 같은 방법에서 갔다 사용 된 목록 중 하나에 표시됩니다.

제 질문은 더 좋은 방법입니까? 이것들은 큰 커스텀 물건이 아니기 때문에리스트에있는 구조체 일뿐입니다. 이 데이터는 결국 DB가 될 예정이므로 클래스를 사용하고 싶지 않습니다.

+3

나는'목록 을 대체 할 것이다 '를 IEnumerable 와 함께 사용하면 모든 컬렉션 클래스를 사용할 수 있습니다 (배열, 해시 등) – Neil

+1

더 좋은 방법은 무엇을 의미합니까? 찾고있는 개선 사항이 있습니까? –

+0

늦게 응답해서 죄송합니다. 스택이 나를 이메일로 보낼 것이라고 생각했습니다. 나는 그것을 현재의 프로젝트에서 미래의 사용이나 확장을 위해 더 일반적인 것으로 만들기 위해 그것을 향상시킬만한 것을 찾고있다. – MattyMatt

답변

3

내가 클래스가 더 확장하기 위해 추가 할 수있는 유일한 방법은, \ 기능

private IEnumerable<T> LoadData<T>(IEnumerable<T> list, IDataLoader loader) 
{ 
    ... 
} 

interface IDataLoader 
{ 
     StreamReader Load(...); 
     StreamWriter Save(...); 
} 

와 AA를 저장 부하에 입력으로 데이터로드 인터페이스를 사용하여 입력로드 \ 절약의 더 일반적인 방법입니다 이 LoadData을 변경할 필요하지 않습니다 예 A DB가 추가에 대한 미래의 경우

class FileDataLoader : IDataLoader 
{ 
    ... 
} 

이 방법으로 파일 입력에 대한 더 많은 동시 클래스

+0

링크가있어서 좀 더 읽을 수 있을까요? 나는 초심자이고 (분명히), 나는 전에 이것을 보지 못했다. – MattyMatt

+0

이 방법론은 Inversion of Control이라고하며,이 특정 예는 직접 종속성 주입입니다. http://joelabrahamsson.com/inversion-of-control-an-introduction-with-examples-in-net/ –

+0

감사합니다. 잘 읽었습니다. 일단 프로토 타입이 기능적으로 작동한다는 것을 살펴볼 것입니다. – MattyMatt

관련 문제