2011-03-15 4 views
2

배경 : 폼의 ViewModel에는 7 개의 속성이 있고, 각 ViewModel은 마법사의 섹션을 나타내며 모두 IFormSection을 구현합니다. 멀티 섹션 AJAX 클라이언트와 단일 섹션 JavaScript 비활성화 클라이언트 사이에서 이러한 ViewModels에 단일 정의 (예 : DRY/SPoT)를 사용하려고합니다.일반적인 작업을 위해 정렬 된 C# 속성 목록?

자동 직렬/역 직렬화 (즉, ASP.NET MVC 모델 바인딩)가 작동하도록 속성을 속성으로 액세스 할 수 있어야하며 제출되지 않은 섹션을 나타내려면 해당 속성을 개별적으로 nullable로 설정해야합니다.

그러나 공통된 IFormSection 연산을 사용하여 이러한 직렬화 가능 속성을 순서대로 반복하는 경우도 6 ~ 10 번 있습니다. 그러면 재사용을 위해이 속성 목록을 어떻게 저장할 수 있습니까? 편집 : 이것은 전체로드 작업에서 일괄 처리 new()을 포함합니다. 내가 너무 많은 반사 전화 나 바보 같은 물건을 할 수있는 제네릭 결과, 추상적 인 정적 메서드를 가질 수 없습니다 문제로 실행 해요

interface IFormSection { 
    void Load(); 
    void Save(); 
    bool Validate(); 
    IFormSection GetNextSection(); // It's ok if this has to be done via ISectionManager 
    string DisplayName; // e.g. "Contact Information" 
    string AssociatedViewModelName; // e.g. "ContactInformation" 
} 
interface ISectionManager { 
    void LoadAllSections(); // EDIT: added this to clarify a desired use. 
    IFormSection GetRequestedSection(string name); // Users can navigate to a specific section 
    List<IFormSection> GetSections(bool? ValidityFilter = null); 
    // I'd use the above List to get the first invalid section 
    // (since a new user cannot proceed past an invalid section), 
    // also to get a list of sections to call .Save on, 
    // also to .Load and render all sections. 
} 
interface IFormTopLevel { 
    // Bindable properties 
    IFormSection ProfileContactInformation { get; set; } 
    IFormSection Page2 { get; set; } 
    IFormSection Page3 { get; set; } 
    IFormSection Page4 { get; set; } 
    IFormSection Page5 { get; set; } 
    IFormSection Page6 { get; set; } 
    IFormSection Page7 { get; set; } 
} 

: 뭔가처럼 예를 들어

는, 어쩌면 최종 결과가 보인다 , 그리고 나의 모든 사고 과정을 악화시키는 다른 문제들.

도움 말?

p.s. 저는 대리인이나 다른 것이 포함 된 훨씬 단순한 디자인을 간과 할 수도 있습니다. 또한 여기에 SoC 문제가 있음을 알았지 만 StackOverflow 문제를 요약 한 결과는 아닙니다.

+0

현재 각 속성에 OrderedDictionary의 단일 멤버를 반영하려고하고 있지만 작동 방법을 상상하는 데 문제가 있습니다. – shannon

+0

이와 같이 속성을 연결하는 대신 마법사의 각 단계를 별도로 저장하는 것이 좋습니다. 나는 경험을 통해 말하면서 디버깅하고 그렇게 쉽게 작업 할 수 있다고 말하고 있습니다. – jfar

+0

@jfar : "저장 하시겠습니까?" http 게시 작업을 의미합니까? 또는 각 CRU (D) 대응을 위해 컨트롤러에 스위치 명령문을 작성 하시겠습니까? 데이터 유효성 검사 규칙을 강화한 후 첫 번째 잘못된 페이지를 합리적으로 열어서 각 양식 단계에 별도의 URL을 사용하고 싶지 않습니다. – shannon

답변

1

순서가 일정하면 IEnumerable<object>을 반환하는 속성이나 메서드를 사용할 수 있습니다. yield는 각 속성 값을 반환합니다 ... 또는 IEnumerable<Tuple<string,object>> ... 나중에 반복 할 수 있습니다. 슈퍼 간단한 같은

뭔가 :

private IEnumerable<Tuple<string,object>> GetProps1() 
{ 
    yield return Tuple.Create("Property1", Property1); 
    yield return Tuple.Create("Property2", Property2); 
    yield return Tuple.Create("Property3", Property3); 
} 

당신은 같은 일을하고 더 일반적인 접근 방식을 원한다면, 당신은 반사 사용할 수 있습니다

private IEnumerable<Tuple<string,object>> GetProps2(){ 
    var properties = this.GetType().GetProperties(); 
    return properties.Select(p=>Tuple.Create(p.Name, p.GetValue(this, null))); 
} 

또는, 나도 몰라? 확장 메서드 어쩌면?

private static IEnumerable<Tuple<string,object>> GetProps3(this object obj){ 
    var properties = obj.GetType().GetProperties(); 
    return properties.Select(p=>Tuple.Create(p.Name, p.GetValue(obj, null))); 
} 
+0

존 감사합니다. 예, 주문은 일정합니다. Ok. 이렇게하면 여기에 값을 설정할 수 없기 때문에'new()'와'.Load()'를 일괄 처리 할 수 ​​없지만 아마 받아 들일 수 있습니다. 시나리오 내 질문에). 리플렉션을 통해 별도로 처리 할 수 ​​있습니다. – shannon