2011-03-15 50 views
2

背景:我有一個窗體ViewModel有7個屬性,每個ViewModel表示一個嚮導的部分,全部實現IFormSection。我試圖在多節AJAX客戶端和單節JavaScript禁用客戶端之間爲這些ViewModel使用單個定義(即DRY/SPoT)。針對常見操作的C#屬性的排序列表?

將這些可訪問屬性設置爲自動序列化/反序列化工作(即ASP.NET MVC模型綁定)非常重要,並且這些屬性還必須單獨爲空,以指示未提交的部分。

但我也有6-10次使用常見的IFormSection操作遍歷這些可序列化的屬性,在某些情況下以有序的方式。那麼,我該如何存儲這個屬性列表以供重用?編輯:這包括批量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 2011-03-15 23:24:00

+0

您可能希望單獨保存嚮導中的每個步驟,而不是像這樣鏈接屬性。當我說它更容易調試並以這種方式工作時,我正在從經驗中談到。 – jfar 2011-03-16 02:39:07

+0

@jfar:請您澄清「保存」嗎?你的意思是http post操作?或者,你的意思是在控制器中爲每個CRU(D)的責任創建switch語句?我不希望每個表單步驟都有單獨的URL,因爲我希望能夠合理地打開第一個無效頁面(例如收緊數據驗證規則之後)。 – shannon 2011-03-16 09:05:12

回答

1

如果訂單不變,您可以有一個屬性或方法返回IEnumerable<object>;然後收益率返回每個屬性值...或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))); 
} 

,或者IDK的?擴展方法可能是什麼?

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

謝謝喬恩。是的,訂單將保持不變。好的,所以這不允許我批量'new()'然後加上'.Load()',因爲我不能在這裏設置值,但這可能是可以接受的(我看到我沒有真正說明在我的問題情景)。我可以通過反思單獨做到這一點。 – shannon 2011-03-16 00:16:09

相關問題