MyType : DynamicObject のリストがあります。MyType が DynamicObject から継承する理由は、不明な数のプロパティを含むことができる型が必要だからです。
リストをフィルタリングする必要があるまで、すべて正常に機能します。次のようなことを行うlinqを実行できる方法はありますか:
return all items where any of the properties is empty string or white space?
(コメントから)リストを使用して上記のlinqクエリを実行できますか?
はい、これがあなたがそれを行う方法ですExpandoObject
:
var list = new List<ExpandoObject>();
dynamic e1 = new ExpandoObject();
e1.a = null;
e1.b = "";
dynamic e2 = new ExpandoObject();
e2.x = "xxx";
e2.y = 123;
list.Add(e1);
list.Add(e2);
var res = list.Where(
item => item.Any(p => p.Value == null || (p.Value is string && string.IsNullOrEmpty((string)p.Value)))
);
はExpandoObject
、プロパティと値のペアを辞書にあるかのように列挙できるインターフェイスを提供し、それらをチェックするプロセスを大幅に簡素化します。
各オブジェクトのプロパティが内部的に不明でない限り、それを行うことができます。
動的オブジェクトのすべてのプロパティをテストするための優れた一般的な方法はありません。実装者が実装するDynamicObject
ことを希望する制御がなく、プロパティ名を取得して動的に呼び出すGetDynamicMemberNames()
ためにnugetパッケージImpromptuInterfaceのメソッドを使用できる場合名前。
return allItems.Where(x=> Impromptu.GetMemberNames(x, dynamicOnly:true)
.Any(y=>String.IsNullOrWhiteSpace(Impromptu.InvokeGet(x,y));
それ以外の場合は、独自のタイプMyType
であるため、これらのメンバー値の内部アカウンティングを確認できる独自のメソッドを追加できます。
return allItems.Where(x => x.MyValues.Any(y=>String.IsNullOrWhitespace(x));