2009-08-20 36 views
3

jquery有一個名爲'extend'的函數,它可以用來合併對象。將默認選項與用戶指定的選項合併以獲取有效選項非常有用。jquery喜歡在c#中擴展。.net

c#/ .net中是否有類似的函數?

class settings 
{ 
    public string Directory; 
    public string Username; 
} 
settings default_set = new settings(){ Directory = "C:/" , Username = "admin" }; 
settings user_set = new settings(){ Username = "john" }; 

settings merged  = new settings(){ Directory = "C:/" , Username = "john" }; 

有什麼辦法從另外兩個對象中獲取合併數據嗎? 是否有任何泛型函數或我應該使用反射做一些編碼?

回答

2

我創建了一個類似於RouteValueDictionary的實現此目的的合併功能。

用法:

var defaultSet = new ParameterDictionary(new { Directory = "C:/", Username = "admin" }); 
defaultSet["Username"] = "john"; // contains C:/ and "john" 
defaultSet.Merge(new { Directory = "D:/" }); // contains D:/ and "john" 
defaultSet.Merge(new { Directory = "C:/", Username = "admin" }); // back to original 

實現:

public class ParameterDictionary : Dictionary<string, object> 
{ 
    public ParameterDictionary() 
     : base() 
    { 
    } 

    /// <summary> 
    /// Build the parameter dictionary from the public properties of the supplied object 
    /// where each key is a property name and each value is the corresponding property's 
    /// valuye. 
    /// </summary> 
    /// <param name="parameters">An object containg the properties making up the initial key/value dictionary state.</param> 
    public ParameterDictionary(object parameters) 
     : this() 
    { 
     if (parameters != null) 
     { 
      if (parameters is IDictionary) 
      { 
       this.Merge(parameters as IDictionary, true); 
      } 
      else 
      { 
       foreach (PropertyInfo info in parameters.GetType().GetProperties()) 
       { 
        object value = info.GetValue(parameters, null); 
        this.Add(info.Name, value); 
       } 
      } 
     } 
    } 

    /// <summary> 
    /// Merge a dictionary of keys/values with the current dictionary. 
    /// </summary> 
    /// <param name="dict">The dictionary whos parameters will be added. Must have string keys.</param> 
    /// <param name="replace">True if conflicting parameters should replace the existing ones, false otherwise.</param> 
    /// <returns>The updated Parameter dictionary.</returns> 
    public ParameterDictionary Merge(IDictionary dict, bool replace) 
    { 
     foreach (string key in dict.Keys) 
     { 
      if (this.ContainsKey(key)) 
      { 
       if (replace) 
       { 
        this[key] = dict[key]; 
       } 
      } 
      else 
      { 
       this.Add(key, dict[key]); 
      } 
     } 
     return this; 
    } 

    /// <summary> 
    /// Merge a dictionary of keys/values with the current dictionary. Replaces conflicting keys. 
    /// </summary> 
    /// <param name="dict">The dictionary whos parameters will be added. Must have string keys.</param> 
    /// <returns>The updated Parameter dictionary.</returns> 
    public ParameterDictionary Merge(object dict) 
    { 
     return Merge(dict, true); 
    } 

    /// <summary> 
    /// Merge a dictionary of keys/values with the current dictionary. 
    /// </summary> 
    /// <param name="dict">An object whose properties are used as the new keys/values for the update.</param> 
    /// <param name="replace">True if conflicting parameters should replace the existing ones, false otherwise.</param> 
    /// <returns>The updated Parameter dictionary.</returns> 
    public ParameterDictionary Merge(object dict, bool replace) 
    { 
     ParameterDictionary newDict = new ParameterDictionary(dict); 
     return Merge(newDict, replace); 
    } 
}