83

文字列プロパティ名の質問ではなくラムダを使用してモデルプロパティを選択し、次のようにコレクションにプロパティを追加したいという答えに基づいて行動します。

var props = new ExportPropertyInfoCollection<JobCard>();
props.Include(model => model.BusinessInstallNumber).Title("Install No").Width(64).KeepZeroPadding(true);
props.Include(model => model.DeviceName).Title("Device").Width(70);
props.Include(model => model.DateRequested).Title("Request Date").Format("{0:dd/MM/yyyy}").Width(83);

Includeメソッドに次のコードを記述しました。

public class PropertyCollection<T>
{
    public void Include(Expression<Func<T, object>> expression)
    {
        var memberExpression = expression.Body as MemberExpression;
        if (memberExpression != null)
        {
            var pes = new ExportPropertyInfoBuilder {Property = new ExportPropertyInfo {Property = memberExpression.Member as PropertyInfo}};
            Properties.Add(pes.Property.Property.Name, pes.Property);
            return pes;
    }

ただし、コードを実行すると、一部のラムダが期待どおりにMemberExpression値を生成したのに対し、他のラムダはUnaryExpression値を生成したことがわかりました。ラムダを使用してすべてのプロパティを追加する前に、コードの最初の行を次のように変更する必要がありました。

var memberExpression = expression.Body as MemberExpression ?? ((UnaryExpression) expression.Body).Operand as MemberExpression;

すべてのプロパティは、POCOビジネスオブジェクトの「単純な」タイプ、つまりstring、DateTime、int、boolなどです。それらは、いくつかのさまざまなDataAnnotations属性で装飾されています。

私の例のラムダの一部がMemberExpression値を生成し、他のラムダがUnaryExpression値を生成する原因は何ですか?私の例では、最初のUnaryExpressionは3行目のDateTimeプロパティにありますが、ブール値のプロパティもUnaryExpressionsになります。

4

1 に答える 1

68

私は問題が何であるかを知っていると思います。あなたの式は type を返しますobject

これをExpression<Func<T, R>>戻り値の型に変更すると、正しく推論され、UnaryExpression(これは何らかのボクシング操作であると仮定します) 発生しません。

アップデート:

の署名はInclude次のとおりです。

public void Include<T, R>(Expression<Func<T, R>> expression)
于 2010-08-26T08:17:16.267 に答える