2

の署名を持つサードパーティ API に渡すために、実行時に式を作成しようとしています Expression<Func<T, object>>。以下は私がこれまでに持っているものです。これは参照型では問題なく機能しますが、値型では例外が発生します (3 行目)。

タイプ 'System.Boolean' の式は、戻りタイプ 'System.Object' には使用できません

これは、私が扱っていないボクシングの問題によるものだと思います。

を追加しようとしましExpression.TypeAs(property, typeof(object))たが、API は を生成するため、この入力を受け入れ/解析しませんobj=> (obj.Foo As Object)

任意の型に必要な署名に一致する式を作成する方法について、誰かアイデアはありますか?

// must be in the form of 'obj => obj.Foo', or the API wont parse
private static Expression<Func<T, object>> CreatePropertyExpression(PropertyInfo propertyInfo)
{
   var instanceParam = Expression.Parameter(propertyInfo.DeclaringType, "obj");
   var property = Expression.Property(instanceParam, propertyInfo);
   var lambda = Expression.Lambda<Func<T, object>>(property, instanceParam); // kaboom

   return (Expression<Func<T, object>>)lambda;
}
4

1 に答える 1

2

キャスト/変換を追加します。

return Expression.Lambda<Func<T, object>>(
    Expression.Convert(property, typeof(object)), instanceParam);
于 2013-02-05T12:53:24.250 に答える