1

インターフェイスのプロパティ名を表す文字列を式に変換する必要があります。私はそれのほとんどを機能させていますが、最後に理解できないのは1つだけです。

 static Expression<Func<T, int>> MakeGetter<T>(string propertyName)
    {
         var input = Expression.Parameter(typeof(T));
         var property = typeof(T).GetProperty(propertyName) ??
                                   GetProperty(propertyName, typeof(T));

         var expr = Expression.Property(input, property);
         var propType = property.PropertyType.Name;

         switch (propType.ToLower())
         {
              case "string":
                   return Expression.Lambda<Func<T, string>>(expr, input);
              case "int":
                   return Expression.Lambda<Func<T, int>>(expr, input);
         }
  }

  private static PropertyInfo GetProperty(string propertyName, Type i)
  {
       var baseInterfaces = i.GetInterfaces();
       foreach (var baseInterface in baseInterfaces)
       {
            var property = baseInterface.GetProperty(propertyName);
            return property ?? GetProperty(propertyName, baseInterface);
       }
       return null;
  }

私が抱えている 1 つの問題は、MakeGetter 関数の最後にあることです。関数が文字列なのか、int なのか、それとも他の型なのかがわからず、すべてのリフレクションを実行するまで知る方法がありません。このメソッドを作成して、ジェネリックで Expression を正しく返すようにします。

4

2 に答える 2

0

コメントでこれに対する意図を宣言したので、ここで受け入れられた答えはあなたが探しているものだと思います. 探しているものとまったく同じではない場合でも、次の行が引き継がれる可能性があります。

// TODO: Get 'type' from the property you want.
Type delegateType = typeof(Func<,>).MakeGenericType(typeof(T), type);
LambdaExpression lambda = Expression.Lambda(delegateType, expr, arg);

を返すLambdaExpressionか、その回答にある拡張メソッドを使用するか、 DynamicLinqを使用できます。この話の教訓は(よくあることですが)、おそらくすでに行われているということだと思います:)。

于 2013-08-02T16:26:54.840 に答える