Paradox Game Engine  v1.0.0 beta06
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Events Macros Pages
ObservableNodeDynamicMetaObject.cs
Go to the documentation of this file.
1 // Copyright (c) 2014 Silicon Studio Corp. (http://siliconstudio.co.jp)
2 // This file is distributed under GPL v3. See LICENSE.md for details.
3 using System.Dynamic;
4 using System.Linq.Expressions;
5 using System.Reflection;
6 
7 namespace SiliconStudio.Presentation.Quantum
8 {
9  internal class ObservableNodeDynamicMetaObject : DynamicMetaObject
10  {
11  public ObservableNodeDynamicMetaObject(Expression parameter, ObservableNode observableNode)
12  : base(parameter, BindingRestrictions.Empty, observableNode)
13  {
14  }
15 
16  public override DynamicMetaObject BindGetMember(GetMemberBinder binder)
17  {
18  var self = Expression.Convert(Expression, LimitType);
19 
20  Expression expression;
21  var propertyName = binder.Name;
22  var args = new Expression[1];
23 
24  if (binder.Name.StartsWith(ObservableViewModel.HasChildPrefix))
25  {
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);
30  }
31  else if (binder.Name.StartsWith(ObservableViewModel.HasCommandPrefix))
32  {
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);
37  }
38  else if (binder.Name.StartsWith(ObservableViewModel.HasAssociatedDataPrefix))
39  {
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);
44  }
45  else
46  {
47  args[0] = Expression.Constant(propertyName);
48  expression = Expression.Call(self, typeof(ObservableNode).GetMethod("GetDynamicObject", BindingFlags.Public | BindingFlags.Instance), args);
49  }
50 
51  var getMember = new DynamicMetaObject(expression, BindingRestrictions.GetTypeRestriction(Expression, LimitType));
52  return getMember;
53  }
54  }
55 }