[解決済み] オブジェクトのプロパティに 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)
関連
-
[解決済み] .net 4.5アップグレード後、System.Web.Httpが見つからない
-
[解決済み] DelphiとDelphi.NETの違いについて
-
[解決済み] AssemblyVersion、AssemblyFileVersion、AssemblyInformationalVersionの違いは何ですか?
-
[解決済み] Entity FrameworkとLINQ to SQLの比較
-
[解決済み] WPFの場合、x:Name属性とName属性の違いは何ですか?
-
[解決済み] .NETのCultureInfoのCurrentCultureとCurrentUICultureのプロパティの違いは何ですか?
-
[解決済み】.NETで文字列が不変なら、なぜSubstringはO(n)時間かかるの?
-
[解決済み】いくつかの良い.NETプロファイラーとは何ですか?
-
[解決済み】オブジェクトを渡すときに'ref'キーワードを使用するのはなぜですか?
-
[解決済み】LINQ:新しいオブジェクトを作成せずに、オブジェクトを選択し、いくつかのプロパティを変更します。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] [Solved] ファイル *.mdf をデータベースとしてアタッチできない
-
[解決済み] データテーブルの並べ替え
-
[解決済み] WCF エラーの解決。このサービスのメタデータパブリッシングは現在無効になっています。
-
[解決済み] AndroidでWCFサービスを利用する方法
-
[解決済み] LINQ to Entitiesはメソッドを認識しません。
-
[解決済み] DelphiとDelphi.NETの違いについて
-
[解決済み] このコンピュータには、.NET Framework 4.6またはそれ以降の更新プログラムがすでにインストールされています。
-
[解決済み] LINQクエリでToList()とToArray()のどちらを呼び出すのが良いですか?
-
[解決済み] Microsoft.ACE.OLEDB.12.0' プロバイダがローカルマシンに登録されていません。
-
[解決済み】プロパティの名前を文字列で取得する