JQuery, как расширение в C # /. Net - PullRequest
3 голосов
/ 20 августа 2009

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

Есть ли способ получить объединенные данные от двух других двух объектов? Есть ли какая-либо общая функция, или я должен сделать некоторое кодирование, используя Reflection?

1 Ответ

3 голосов
/ 20 августа 2009

Я создал аналог 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 );
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...