Paradox Game Engine  v1.0.0 beta06
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Events Macros Pages
ClassFieldExtensions.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;
4 using System.Collections.Generic;
5 using System.Linq;
6 using System.Text;
7 using System.Linq.Expressions;
8 
9 namespace SiliconStudio.Presentation.Extensions
10 {
11  public static class ClassFieldExtensions
12  {
13  public static Func<TInstance, TValue> GetFieldAccessor<TInstance, TValue>(string fieldName)
14  {
15  ParameterExpression instanceParam = Expression.Parameter(typeof(TInstance), "instance");
16  MemberExpression member = Expression.Field(instanceParam, fieldName);
17  LambdaExpression lambda = Expression.Lambda(typeof(Func<TInstance, TValue>), member, instanceParam);
18 
19  return (Func<TInstance, TValue>)lambda.Compile();
20  }
21 
22  public static Func<object, object> GetFieldAccessor(string fieldName, Type instanceType, Type valueType)
23  {
24  ParameterExpression instanceParam = Expression.Parameter(instanceType, "instance");
25  MemberExpression member = Expression.Field(instanceParam, fieldName);
26  LambdaExpression lambda = Expression.Lambda(typeof(Func<object, object>), member, instanceParam);
27 
28  return (Func<object, object>)lambda.Compile();
29  }
30 
31  public static Action<TInstance, TValue> SetFieldAccessor<TInstance, TValue>(string fieldName)
32  {
33  ParameterExpression instanceParam = Expression.Parameter(typeof(TInstance), "instance");
34  ParameterExpression valueParam = Expression.Parameter(typeof(TValue), "value");
35  MemberExpression member = Expression.Field(instanceParam, fieldName);
36  BinaryExpression assign = Expression.Assign(member, valueParam);
37  LambdaExpression lambda = Expression.Lambda(typeof(Action<TInstance, TValue>), assign, instanceParam, valueParam);
38 
39  return (Action<TInstance, TValue>)lambda.Compile();
40  }
41 
42  public static Action<object, object> SetFieldAccessor(string fieldName, Type instanceType, Type valueType)
43  {
44  ParameterExpression instanceParam = Expression.Parameter(instanceType, "instance");
45  ParameterExpression valueParam = Expression.Parameter(valueType, "value");
46  MemberExpression member = Expression.Field(instanceParam, fieldName);
47  BinaryExpression assign = Expression.Assign(member, valueParam);
48  LambdaExpression lambda = Expression.Lambda(typeof(Action<object, object>), assign, instanceParam, valueParam);
49 
50  return (Action<object, object>)lambda.Compile();
51  }
52  }
53 }
static Action< object, object > SetFieldAccessor(string fieldName, Type instanceType, Type valueType)
static Func< object, object > GetFieldAccessor(string fieldName, Type instanceType, Type valueType)