4 using System.Collections.Generic;
7 using System.Linq.Expressions;
9 namespace SiliconStudio.Presentation.Extensions
13 public static Func<TInstance, TValue> GetFieldAccessor<TInstance, TValue>(
string fieldName)
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);
19 return (Func<TInstance, TValue>)lambda.Compile();
22 public static Func<object, object>
GetFieldAccessor(
string fieldName, Type instanceType, Type valueType)
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);
28 return (Func<object, object>)lambda.Compile();
31 public static Action<TInstance, TValue> SetFieldAccessor<TInstance, TValue>(
string fieldName)
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);
39 return (Action<TInstance, TValue>)lambda.Compile();
42 public static Action<object, object>
SetFieldAccessor(
string fieldName, Type instanceType, Type valueType)
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);
50 return (Action<object, object>)lambda.Compile();
static Action< object, object > SetFieldAccessor(string fieldName, Type instanceType, Type valueType)
static Func< object, object > GetFieldAccessor(string fieldName, Type instanceType, Type valueType)