From b5c78d397d2daafe74c8ca7aeee5ae2e8a646a3d Mon Sep 17 00:00:00 2001 From: hartvig Date: Fri, 18 Feb 2011 13:02:20 -0100 Subject: [PATCH] Updates to fetching extension methods in a more stable way in DynamicNodeList --- umbraco.MacroEngines.Juno/BaseContext.cs | 2 +- umbraco.MacroEngines.Juno/DynamicNodeList.cs | 4 +++ .../UmbracoParameterDictionary.cs | 29 ++++++++++++++----- 3 files changed, 27 insertions(+), 8 deletions(-) diff --git a/umbraco.MacroEngines.Juno/BaseContext.cs b/umbraco.MacroEngines.Juno/BaseContext.cs index fcccbece5a..1f2abe37e2 100644 --- a/umbraco.MacroEngines.Juno/BaseContext.cs +++ b/umbraco.MacroEngines.Juno/BaseContext.cs @@ -13,7 +13,7 @@ namespace umbraco.MacroEngines protected IParameterDictionary ParameterDictionary; protected ICultureDictionary CultureDictionary; - public dynamic Parameter { get { return ParameterDictionary; } } + public dynamic MacroParameters { get { return ParameterDictionary; } } public dynamic Dictionary { get { return CultureDictionary; } } public MacroModel Macro { get { return _macro; } } diff --git a/umbraco.MacroEngines.Juno/DynamicNodeList.cs b/umbraco.MacroEngines.Juno/DynamicNodeList.cs index 958f5d4b00..96a46dd94c 100644 --- a/umbraco.MacroEngines.Juno/DynamicNodeList.cs +++ b/umbraco.MacroEngines.Juno/DynamicNodeList.cs @@ -219,6 +219,10 @@ namespace umbraco.MacroEngines } MethodInfo firstMethod = methods.First(); + // NH: this is to ensure that it's always the correct one being chosen when using the LINQ extension methods + if (methods.Count > 1) + firstMethod = methods.First(x => x.IsGenericMethodDefinition); + MethodInfo methodToExecute = null; if (firstMethod.IsGenericMethodDefinition) { diff --git a/umbraco.MacroEngines.Juno/UmbracoParameterDictionary.cs b/umbraco.MacroEngines.Juno/UmbracoParameterDictionary.cs index 8e959c781e..d04a9db2f5 100644 --- a/umbraco.MacroEngines.Juno/UmbracoParameterDictionary.cs +++ b/umbraco.MacroEngines.Juno/UmbracoParameterDictionary.cs @@ -5,32 +5,47 @@ using System.Dynamic; using umbraco.cms.businesslogic.macro; using System.Linq; -namespace umbraco.MacroEngines { +namespace umbraco.MacroEngines +{ - public class UmbracoParameterDictionary : DynamicObject, IParameterDictionary { + public class UmbracoParameterDictionary : DynamicObject, IParameterDictionary + { private readonly IEnumerable _paramsKeyValue; - public UmbracoParameterDictionary(IEnumerable paramsKeyValue) { + public UmbracoParameterDictionary(IEnumerable paramsKeyValue) + { _paramsKeyValue = paramsKeyValue; if (_paramsKeyValue == null) _paramsKeyValue = new List(); } - public IEnumerator> GetEnumerator() { + public IEnumerator> GetEnumerator() + { return _paramsKeyValue.Select(p => new KeyValuePair(p.Key, p.Value)).GetEnumerator(); } - IEnumerator IEnumerable.GetEnumerator() { + IEnumerator IEnumerable.GetEnumerator() + { return GetEnumerator(); } - public string this[string alias] { + public string this[string alias] + { get { return _paramsKeyValue.Where(p => p.Key == alias).Select(p => p.Value).FirstOrDefault(); } } - public override bool TryGetMember(GetMemberBinder binder, out object result) { + public override bool TryGetMember(GetMemberBinder binder, out object result) + { result = this[binder.Name]; + + // we'll check if parameters no matter the casing (due to the macro parser lower case all parameter aliases) + if (result == null || String.IsNullOrEmpty(result.ToString())) + { + + if (this.Any(x => x.Key.ToLower() == binder.Name.ToLower())) + result = this.First(x => x.Key.ToLower() == binder.Name.ToLower()).Value; + } return true; } }