【问题标题】:jquery like extend in c#/.Netjquery 喜欢在 c#/.Net 中扩展
【发布时间】:2009-08-20 13:28:57
【问题描述】:

Jquery 有一个名为“extend”的实用程序,可用于合并对象。将默认选项与用户指定的选项合并,以获得有效的选项非常有用。

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" };

有没有办法从另外两个对象中获取合并的数据? 是否有任何通用功能或者我应该使用反射进行一些编码?

【问题讨论】:

    标签: .net oop reflection


    【解决方案1】:

    我创建了一个类似于 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 );
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2016-04-04
      • 2016-12-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多