From ce4c855f003450bb84fc578df5256444d8de30f5 Mon Sep 17 00:00:00 2001 From: Shannon Deminick Date: Mon, 19 Nov 2012 05:47:34 +0500 Subject: [PATCH] Fixes up the resulting casts when invoking extension methods dynamically in our dynamic objects. --- src/Umbraco.Core/Dynamics/DynamicXml.cs | 12 +++++++----- src/Umbraco.Web/Models/DynamicPublishedContent.cs | 13 +++++++------ .../Models/DynamicPublishedContentList.cs | 13 +++++++------ 3 files changed, 21 insertions(+), 17 deletions(-) diff --git a/src/Umbraco.Core/Dynamics/DynamicXml.cs b/src/Umbraco.Core/Dynamics/DynamicXml.cs index ef3114f111..a6a7441580 100644 --- a/src/Umbraco.Core/Dynamics/DynamicXml.cs +++ b/src/Umbraco.Core/Dynamics/DynamicXml.cs @@ -75,6 +75,7 @@ namespace Umbraco.Core.Dynamics //ok, now lets try to match by member, property, extensino method var attempt = DynamicInstanceHelper.TryInvokeMember(this, binder, args, new[] { + typeof (IEnumerable), typeof (IEnumerable), typeof (DynamicXml) }); @@ -86,17 +87,18 @@ namespace Umbraco.Core.Dynamics //need to check the return type and possibly cast if result is from an extension method found if (attempt.Result.Reason == DynamicInstanceHelper.TryInvokeMemberSuccessReason.FoundExtensionMethod) { - if (attempt.Result.ObjectResult != null) + //if the result is already a DynamicXml instance, then we do not need to cast + if (attempt.Result.ObjectResult != null && !(attempt.Result.ObjectResult is DynamicXml)) { if (attempt.Result.ObjectResult is XElement) { - result = new DynamicXml((XElement) attempt.Result.ObjectResult); + result = new DynamicXml((XElement)attempt.Result.ObjectResult); } - if (attempt.Result.ObjectResult is IEnumerable) + else if (attempt.Result.ObjectResult is IEnumerable) { - result = ((IEnumerable) attempt.Result.ObjectResult).Select(x => new DynamicXml(x)); + result = ((IEnumerable)attempt.Result.ObjectResult).Select(x => new DynamicXml(x)); } - if (attempt.Result.ObjectResult is IEnumerable) + else if (attempt.Result.ObjectResult is IEnumerable) { result = ((IEnumerable)attempt.Result.ObjectResult).Select(x => new DynamicXml(x.BaseElement)); } diff --git a/src/Umbraco.Web/Models/DynamicPublishedContent.cs b/src/Umbraco.Web/Models/DynamicPublishedContent.cs index c41fd4b540..1eb3c1b9ba 100644 --- a/src/Umbraco.Web/Models/DynamicPublishedContent.cs +++ b/src/Umbraco.Web/Models/DynamicPublishedContent.cs @@ -66,20 +66,21 @@ namespace Umbraco.Web.Models //need to check the return type and possibly cast if result is from an extension method found if (attempt.Result.Reason == DynamicInstanceHelper.TryInvokeMemberSuccessReason.FoundExtensionMethod) { - if (attempt.Result.ObjectResult != null) + //we don't need to cast if it is already DynamicPublishedContent + if (attempt.Result.ObjectResult != null && (!(attempt.Result.ObjectResult is DynamicPublishedContent))) { if (attempt.Result.ObjectResult is IPublishedContent) { result = new DynamicPublishedContent((IPublishedContent)attempt.Result.ObjectResult); } - if (attempt.Result.ObjectResult is IEnumerable) + else if (attempt.Result.ObjectResult is IEnumerable) + { + result = new DynamicPublishedContentList((IEnumerable)attempt.Result.ObjectResult); + } + else if (attempt.Result.ObjectResult is IEnumerable) { result = new DynamicPublishedContentList((IEnumerable)attempt.Result.ObjectResult); } - if (attempt.Result.ObjectResult is IEnumerable) - { - result = new DynamicPublishedContentList((IEnumerable)attempt.Result.ObjectResult); - } } } return true; diff --git a/src/Umbraco.Web/Models/DynamicPublishedContentList.cs b/src/Umbraco.Web/Models/DynamicPublishedContentList.cs index 94d32dade3..bc24b99aca 100644 --- a/src/Umbraco.Web/Models/DynamicPublishedContentList.cs +++ b/src/Umbraco.Web/Models/DynamicPublishedContentList.cs @@ -228,20 +228,21 @@ namespace Umbraco.Web.Models //need to check the return type and possibly cast if result is from an extension method found if (attempt.Result.Reason == DynamicInstanceHelper.TryInvokeMemberSuccessReason.FoundExtensionMethod) { - if (attempt.Result.ObjectResult != null) + //we don't need to cast if the result is already DynamicPublishedContentList + if (attempt.Result.ObjectResult != null && (!(attempt.Result.ObjectResult is DynamicPublishedContentList))) { if (attempt.Result.ObjectResult is IPublishedContent) { result = new DynamicPublishedContent((IPublishedContent)attempt.Result.ObjectResult); } - if (attempt.Result.ObjectResult is IEnumerable) - { - result = new DynamicPublishedContentList((IEnumerable)attempt.Result.ObjectResult); - } - if (attempt.Result.ObjectResult is IEnumerable) + else if (attempt.Result.ObjectResult is IEnumerable) { result = new DynamicPublishedContentList((IEnumerable)attempt.Result.ObjectResult); } + else if (attempt.Result.ObjectResult is IEnumerable) + { + result = new DynamicPublishedContentList((IEnumerable)attempt.Result.ObjectResult); + } } } return true;