12

PropertyInfoメソッドの呼び出しに使用できるプロパティ式に変換するStructuralTypeConfiguration<TStructuralType>.Ignore<TProperty>(Expression<Func<TStructuralType, TProperty>> propertyExpression)方法は?

式の作成に使用しようとしましExpression.Property()たが、この式をpropertyExpressionパラメーターとして使用すると次のエラーが発生します。

The type arguments for method cannot be inferred from the usage. Try specifying the type arguments explicitly.

このエラーはおそらくTProperty、指定する方法がわからない型パラメーターを参照しているだけPropertyInfoです。

私はこれに関連してこれを行っています: Entity Framework の StructuralTypeConfiguration.Ignore() を使用して、指定された set 以外のすべてのプロパティを無視します

アップデート

動作しないコード:

var propertyInfo = typeof(Foo).GetProperties()[0];
var expression = Expression.Default(typeof(Foo));
var expressionProperty = Expression.Property(expression, propertyInfo);
Ignore(expressionProperty);
4

4 に答える 4

2

プロパティ式では、特定のオブジェクトに対するプロパティ アクセスが必要です。ここで使用できるオプションがいくつかあります。まず、これがエンティティ オブジェクトの 1 つ内で行われている場合は、ConstantExpression を使用してプロパティ式を簡単に作成できます。

// Already have PropertyInfo in propInfo
Expression.Property(Expression.Constant(this, this.GetType()), propInfo)

ただし、 が必要なのでExpression<Func<TStructuralType, TProperty>>、ParameterExpression を使用してビルドする必要があるようです。

ParameterExpression pe = Parameter.Expression(typeof(MyEntity), "eParam");
Expression propExp = Expression.Property(pe, propInfo);

ただし、キッカーは次のとおりです...これは単なるMemberExpressionです。必要な式に変換するには、必要なExpression.Lambdaタイプの Func<> 式を取得するために使用する必要があります。問題?ラムダ式の汎用パラメーターを定義するプロパティの型がわかりません!

Expression<Func<MyEntity, ????>> eFunc = Expression.Lambda<Func<MyEntity, ????>>(propExp, pe);

これが、この方法で行う問題の核心です。それができないと言っているわけではありません...この方法をこの方法で使用してもうまくいかないというだけです。これを正しく機能させるには、少しランタイムと静的型付けのトリック (および Funcs の代わりに Action を適切に使用する) を使用する必要があります。

于 2012-03-08T17:41:00.317 に答える
1

TPropertyc# ソース コード テキストにのみ存在します。コンパイラは常にそれを具象型に解決します。方法があれば

void Test<T>(T arg)
{
}

そしてそれをこのように呼びます

Test("hello");
Test(3);

コンパイラは 2 つのメソッドのコードを生成します!

void Test(string arg)
{
}

void Test(int arg)
{
}

これは、呼び出し可能なメソッドが必要な場合は、ジェネリック パラメーターに具体的な型を指定する必要があることを意味します。

于 2012-03-08T17:22:35.637 に答える