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);
}
}
}