I created a similar RouteValueDictionary that accomplishes this task using merge capabilities.
Using:
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
Implementation:
public class ParameterDictionary : Dictionary<string, object>
{
public ParameterDictionary()
: base()
{
}
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 );
}
}
}
}
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;
}
public ParameterDictionary Merge( object dict )
{
return Merge( dict, true );
}
public ParameterDictionary Merge( object dict, bool replace )
{
ParameterDictionary newDict = new ParameterDictionary( dict );
return Merge( newDict, replace );
}
}