2016-08-29 9 views
0

私は考えがあり、それが機能するかどうかを知りたい。 プロパティを持つ単純なクラスがあり、式でアクセサーを生成したいと思います。 しかし、最終的に私はFunc<Test, string>を取得する必要がありますが、私はそれらを使用するときにタイプを知らない。 動的に式ツリーを作成する

class Program 
{ 
    static void Main(string[] args) 
    { 
     Test test = new Test(); 
     test.TestString = "Blubb"; 
     var actionStub = typeof(Helper).GetMethod("CreatePropertyGetter").MakeGenericMethod(new Type[] { test.GetType(), typeof(string)}); 
     dynamic action = actionStub.Invoke(null, new object[] {test.GetType(), "TestString"}); 

     var x = action(test); 
    } 
} 

public class Test 
{ 
    public string TestString { get; set; } 
} 

public static class Helper 
{ 
    public static Func<TType, TPropValueType> CreatePropertyGetter<TType, TPropValueType>(Type type, 
                        string propertyName) 
    { 
     PropertyInfo fieldInfo = type.GetProperty(propertyName); 
     ParameterExpression targetExp = Expression.Parameter(typeof(TType), "target"); 

     MemberExpression fieldExp = Expression.Property(targetExp, fieldInfo); 
     UnaryExpression assignExp = Expression.Convert(fieldExp, typeof(TPropValueType)); 

     Func<TType, TPropValueType> getter = 
      Expression.Lambda<Func<TType, TPropValueType>>(assignExp, targetExp).Compile(); 

     return getter; 
    } 
} 

問題は、私はあなたが(TType target) => target.Somethingを生成しているFunc<object, object>

答えて

2

に、単純なキャスト、それをカントので、私は、ダイナミックせずに式を呼び出すカントある小さな例。代わりに、を使用できるように(object target) => (object)((TType)target).Somethingを生成してください。 ?

+0

感謝 – Sebastian

+1

あなたは 'Func 'を作成しようとしているので、パラメータと本体はその署名に従わなければなりません。パラメータはobject型で、bodyはobjectを返す必要があります。次に、Func を使用できます。 – usr

0

それはあなたが求めているまさに明確ではないのですが、ここであなたがそれFunc<object, object>作ることができる方法の例です:あなたはそれをもう少し説明してくださいすることができますため

public static class Helper 
{ 
    public static Func<object, object> CreatePropertyGetter(Type type, string propertyName) 
    { 
     var fieldInfo = type.GetProperty(propertyName); 
     var targetExp = Expression.Parameter(typeof(object), "target"); 
     var fieldExp = Expression.Property(Expression.ConvertChecked(targetExp, type), fieldInfo); 
     var getter = Expression.Lambda<Func<object, object>>(fieldExp,targetExp).Compile(); 
     return getter; 
    } 
} 
関連する問題