-
Notifications
You must be signed in to change notification settings - Fork 11
How to supply Values
Morestachio allows to use several ways for supplying values from an object for the template. They are tried, in following order until any value is obtained:
You can set an object that inherits from IValueResolver and set it with ParserOptionsBuilder.WithValueResolver(IValueResolver). The IValueResolver has two methods: CanResolve and Resolve. If you set an IValueResolver the CanResolve method is the first thing that is called for every path so ensure that your check is not too expensive. If CanResolve returns true, the Resolve method is immediately called and whatever is returned from that method call is used as the result.
If there is ether no IValueResolver or the IValueResolver.CanResolve method returns false, all checks below are executed.
Morestachio handles all instances of IDictionary<string, object> the same as an object by default so you can access all objects and all instances of IDictionary<string, object> alike. It is however possible to disable this behavior by setting ParserOptionsBuilder.WithHandleDictionaryAsObject(bool) to false.
When ParserOptionsBuilder.WithHandleDictionaryAsObject is true but the key is not present in the dictionary, the ParserOptions.OnUnresolvedPath event is triggered and null is returned.
If an object inherits from this interface morestachio will call the IMorestachioPropertyResolver.TryGetValue method and whatever is returned is used as a property.
When an object inherits the interface but IMorestachioPropertyResolver.TryGetValue returns false, the ParserOptions.OnUnresolvedPath event is triggered and null is returned.
This adds explicit support for dynamic types and if present the interface will be called to obtain a property and get its value.
When no property is found in the interface, the ParserOptions.OnUnresolvedPath event is triggered and null is returned.
When none of the above is in used to obtain the value, the IFallbackValueResolver is invoked. This is always set to a Reflection based resolver and will lookup the requested path via Type.GetTypeInfo and PropertyInfo.GetProperty(path). This does only lookup public properties.
When no property is found, the ParserOptions.OnUnresolvedPath event is triggered and null is returned.