The Arguments class is used by Windsor to pass arguments down the invocation pipeline. The class is a simple dictionary-like class, but it has some useful capabilities.
Resolution arguments are key/value pairs, keyed either by name (string) or type (System.Type). How the arguments are added to the Arguments collections determines how they are bound to dependencies during resolution.
The class has several constructors:
new Arguments(); // Empty collection
new Arguments(new Arguments())); // Copy constructorCollection initializers are supported, both named and typed arguments can be provided:
new Arguments {
{ "Name", "John" },
{ "Age", 18 },
{ typeof(IService), new MyService() }
};Arguments will be matched by a string key in a case insensitive manner. For example, logLevel, LogLevel and even LOGLEVEL as property names are all treated as one key.
new Arguments()
.AddNamed("key", 123456)
.AddNamed(new Dictionary<string, string> { { "string-key", "string-value" } });Named arguments can also be added from a plain old C# object or from properties of an anonymous type:
new Arguments()
.AddProperties(myPOCO) // plain old C# object with public properties
.AddProperties(new { logLevel = LogLevel.High }); // anonymous typeArguments can be matched by type as dependencies:
new Arguments()
.AddTyped(LogLevel.High, new AppConfig()) // params array
.AddTyped(typeof(MyClass), new MyClass())
.AddTyped<IService>(new MyService());ℹ️ Typed arguments are matched exactly: When you don't specify the type of the argument, its concrete type will be used. For example, if you pass a MemoryStream it will only match to a dependency of type MemoryStream, but not of the base type Stream. If you want to match it to Stream specify the type explicitly.
A collection implementing the generic IDictionary<TKey, TValue> containing named and/or typed arguments can be added to an Arguments instance:
var map = new Dictionary<object, object>();
map.Add("string-key", 123456);
map.Add(typeof(MyType), 123456);
new Arguments()
.Add(map);