1. ホーム
  2. .net

[解決済み] オブジェクトのプロパティに UnaryExpression と MemberExpression があるのはなぜですか?

2023-07-10 22:38:02

疑問点

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

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;
    }

しかし、このコードを実行すると、いくつかのラムダが メンバー式 の値を返すものもありましたが、他のものは UnaryExpression という値になってしまいました。 私はラムダを使ってすべてのプロパティを追加する前に、コードの最初の行を次のように変更しなければなりませんでした。

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

すべてのプロパティは、POCOビジネスオブジェクトの文字列、DateTime、int、boolなどの「単純な」タイプです。 これらは、いくつかの変化する データアノテーション 属性で装飾されています。

私の例のラムダで、いくつかのラムダが メンバー式 の値を生成し、他の 単項式(UnaryExpression) の値ですか? 私の例では、最初の UnaryExpression は3行目にあり 日付時刻 プロパティですが、ブーリアン・プロパティも結果的に UnaryExpressions .

どのように解決するのですか?

何が問題なのかわかった気がします。あなたの式は、型を返す object .

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

更新しました。

の署名は Include であるべきです。

public void Include<T, R>(Expression<Func<T, R>> expression)