4 using System.Linq.Expressions;
5 using System.Reflection;
7 namespace SiliconStudio.Presentation.Quantum
11 public ObservableNodeDynamicMetaObject(Expression parameter, ObservableNode observableNode)
12 : base(parameter, BindingRestrictions.
Empty, observableNode)
18 var
self = Expression.Convert(Expression, LimitType);
20 Expression expression;
21 var propertyName = binder.Name;
22 var args =
new Expression[1];
24 if (binder.Name.StartsWith(ObservableViewModel.HasChildPrefix))
26 propertyName = binder.Name.Substring(ObservableViewModel.HasChildPrefix.Length);
27 args[0] = Expression.Constant(propertyName);
28 expression = Expression.Call(
self, typeof(ObservableNode).GetMethod(
"GetChild", BindingFlags.Public | BindingFlags.Instance), args);
29 expression = Expression.Convert(Expression.NotEqual(expression, Expression.Constant(null)), binder.ReturnType);
31 else if (binder.Name.StartsWith(ObservableViewModel.HasCommandPrefix))
33 propertyName = binder.Name.Substring(ObservableViewModel.HasCommandPrefix.Length);
34 args[0] = Expression.Constant(propertyName);
35 expression = Expression.Call(
self, typeof(ObservableNode).GetMethod(
"GetCommand", BindingFlags.Public | BindingFlags.Instance), args);
36 expression = Expression.Convert(Expression.NotEqual(expression, Expression.Constant(null)), binder.ReturnType);
38 else if (binder.Name.StartsWith(ObservableViewModel.HasAssociatedDataPrefix))
40 propertyName = binder.Name.Substring(ObservableViewModel.HasAssociatedDataPrefix.Length);
41 args[0] = Expression.Constant(propertyName);
42 expression = Expression.Call(
self, typeof(ObservableNode).GetMethod(
"GetAssociatedData", BindingFlags.Public | BindingFlags.Instance), args);
43 expression = Expression.Convert(Expression.NotEqual(expression, Expression.Constant(null)), binder.ReturnType);
47 args[0] = Expression.Constant(propertyName);
48 expression = Expression.Call(
self, typeof(ObservableNode).GetMethod(
"GetDynamicObject", BindingFlags.Public | BindingFlags.Instance), args);
51 var getMember =
new DynamicMetaObject(expression, BindingRestrictions.GetTypeRestriction(Expression, LimitType));