diff --git a/umbraco.MacroEngines.Juno/RazorDynamicNode/DynamicMedia.cs b/umbraco.MacroEngines.Juno/RazorDynamicNode/DynamicMedia.cs index 385c9b15eb..651215aeda 100644 --- a/umbraco.MacroEngines.Juno/RazorDynamicNode/DynamicMedia.cs +++ b/umbraco.MacroEngines.Juno/RazorDynamicNode/DynamicMedia.cs @@ -124,5 +124,14 @@ namespace umbraco.MacroEngines //return true because the _media is likely null, meaning we're in test mode return true; } + + public bool IsNull() + { + return false; + } + public bool HasValue() + { + return true; + } } } diff --git a/umbraco.MacroEngines.Juno/RazorDynamicNode/DynamicMediaList.cs b/umbraco.MacroEngines.Juno/RazorDynamicNode/DynamicMediaList.cs index ffd0fa1e00..d5e086a7fb 100644 --- a/umbraco.MacroEngines.Juno/RazorDynamicNode/DynamicMediaList.cs +++ b/umbraco.MacroEngines.Juno/RazorDynamicNode/DynamicMediaList.cs @@ -34,5 +34,13 @@ namespace umbraco.MacroEngines return Items.GetEnumerator(); } + public bool IsNull() + { + return false; + } + public bool HasValue() + { + return true; + } } } diff --git a/umbraco.MacroEngines.Juno/RazorDynamicNode/DynamicNode.cs b/umbraco.MacroEngines.Juno/RazorDynamicNode/DynamicNode.cs index bba820f13e..105f9518ae 100644 --- a/umbraco.MacroEngines.Juno/RazorDynamicNode/DynamicNode.cs +++ b/umbraco.MacroEngines.Juno/RazorDynamicNode/DynamicNode.cs @@ -226,6 +226,104 @@ namespace umbraco.MacroEngines } return false; } + public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result) + { + try + { + //Property? + result = typeof(DynamicNode).InvokeMember(binder.Name, + System.Reflection.BindingFlags.Instance | + System.Reflection.BindingFlags.Public | + System.Reflection.BindingFlags.NonPublic | + System.Reflection.BindingFlags.GetProperty, + null, + this, + args); + return true; + } + catch (MissingMethodException) + { + try + { + //Static or Instance Method? + result = typeof(DynamicNode).InvokeMember(binder.Name, + System.Reflection.BindingFlags.Instance | + System.Reflection.BindingFlags.Public | + System.Reflection.BindingFlags.NonPublic | + System.Reflection.BindingFlags.Static | + System.Reflection.BindingFlags.InvokeMethod, + null, + this, + args); + return true; + } + catch (MissingMethodException) + { + try + { + result = ExecuteExtensionMethod(args, binder.Name, false); + return true; + } + catch (TargetInvocationException) + { + result = new DynamicNull(); + return true; + } + + catch + { + result = null; + return false; + } + + } + + + } + catch + { + result = null; + return false; + } + + } + + private object ExecuteExtensionMethod(object[] args, string name, bool argsContainsThis) + { + object result = null; + + MethodInfo methodToExecute = ExtensionMethodFinder.FindExtensionMethod(typeof(IEnumerable), args, name, false); + if (methodToExecute == null) + { + methodToExecute = ExtensionMethodFinder.FindExtensionMethod(typeof(DynamicNodeList), args, name, false); + } + if (methodToExecute != null) + { + var genericArgs = (new[] { this }).Concat(args); + result = methodToExecute.Invoke(null, genericArgs.ToArray()); + } + else + { + throw new MissingMethodException(); + } + if (result != null) + { + if (result is IEnumerable) + { + result = new DynamicNodeList((IEnumerable)result); + } + if (result is IEnumerable) + { + result = new DynamicNodeList((IEnumerable)result); + } + if (result is INode) + { + result = new DynamicNode((INode)result); + } + } + return result; + } + public override bool TryGetMember(GetMemberBinder binder, out object result) { @@ -901,5 +999,13 @@ namespace umbraco.MacroEngines return n.ChildrenAsTable(nodeTypeAliasFilter); } + public bool IsNull() + { + return false; + } + public bool HasValue() + { + return true; + } } } diff --git a/umbraco.MacroEngines.Juno/RazorDynamicNode/DynamicNodeList.cs b/umbraco.MacroEngines.Juno/RazorDynamicNode/DynamicNodeList.cs index 0a9e3e7729..4ff6de9545 100644 --- a/umbraco.MacroEngines.Juno/RazorDynamicNode/DynamicNodeList.cs +++ b/umbraco.MacroEngines.Juno/RazorDynamicNode/DynamicNodeList.cs @@ -235,5 +235,13 @@ namespace umbraco.MacroEngines this.Items.Remove(node); } } + public bool IsNull() + { + return false; + } + public bool HasValue() + { + return true; + } } } diff --git a/umbraco.MacroEngines.Juno/RazorDynamicNode/DynamicNull.cs b/umbraco.MacroEngines.Juno/RazorDynamicNode/DynamicNull.cs index 6f62a96485..54ff950ce4 100644 --- a/umbraco.MacroEngines.Juno/RazorDynamicNode/DynamicNull.cs +++ b/umbraco.MacroEngines.Juno/RazorDynamicNode/DynamicNull.cs @@ -39,19 +39,13 @@ namespace umbraco.MacroEngines result = this; return true; } - public bool IsNull + public bool IsNull() { - get - { - return true; - } + return true; } - public bool HasValue + public bool HasValue() { - get - { - return false; - } + return false; } } } diff --git a/umbraco.MacroEngines.Juno/RazorDynamicNode/DynamicXml.cs b/umbraco.MacroEngines.Juno/RazorDynamicNode/DynamicXml.cs index f9a374334c..bdff2e1fcc 100644 --- a/umbraco.MacroEngines.Juno/RazorDynamicNode/DynamicXml.cs +++ b/umbraco.MacroEngines.Juno/RazorDynamicNode/DynamicXml.cs @@ -128,5 +128,14 @@ namespace umbraco.MacroEngines { return this.BaseElement.Elements().Select(e => new DynamicXml(e)).GetEnumerator(); } + + public bool IsNull() + { + return false; + } + public bool HasValue() + { + return true; + } } } diff --git a/umbraco.MacroEngines.Juno/RazorDynamicNode/ExtensionMethods.cs b/umbraco.MacroEngines.Juno/RazorDynamicNode/ExtensionMethods.cs index c4d0900311..2fed8982d0 100644 --- a/umbraco.MacroEngines.Juno/RazorDynamicNode/ExtensionMethods.cs +++ b/umbraco.MacroEngines.Juno/RazorDynamicNode/ExtensionMethods.cs @@ -2,10 +2,11 @@ using System.Collections.Generic; using System.Linq; using System.Text; +using System.Web; namespace umbraco.MacroEngines { - public static class ExtensionMethods + public static class PrivateExtensionMethods { public static IEnumerable Map( this IEnumerable source, @@ -96,5 +97,8 @@ namespace umbraco.MacroEngines { return haystack.IndexOf(needle, StringComparison.CurrentCultureIgnoreCase) >= 0; } + + + } }