using System; using System.Diagnostics; using System.Dynamic; namespace ServiceStack.Razor.Compilation { /// /// Defines a dynamic object. /// internal class RazorDynamicObject : DynamicObject { /// /// Gets or sets the model. /// public object Model { get; set; } /// /// Gets the value of the specified member. /// /// The current binder. /// The member result. /// True. [DebuggerStepThrough] public override bool TryGetMember(GetMemberBinder binder, out object result) { var dynamicObject = Model as RazorDynamicObject; if (dynamicObject != null) return dynamicObject.TryGetMember(binder, out result); Type modelType = Model.GetType(); var prop = modelType.GetProperty(binder.Name); if (prop == null) { result = null; return false; } object value = prop.GetValue(Model, null); if (value == null) { result = value; return true; } Type valueType = value.GetType(); result = (CompilerServices.IsAnonymousType(valueType)) ? new RazorDynamicObject { Model = value } : value; return true; } public override bool TryConvert(ConvertBinder binder, out object result) { if (binder.ReturnType == Model.GetType()) { result = Model; return true; } return base.TryConvert(binder, out result); } } }