2012-08-01 6 views
5

私はMyType:DynamicObjectのListを持っています。 DynamicObjectから継承するMyTypeの理由は、不明な数のプロパティを含むことができる型が必要なことです。Linq with DynamicObject

リストをフィルタリングする必要があるまで、すべて正常に動作します。

return all items where any of the properties is empty string or white space? 
+0

「ExpandoObject」などの未知のプロパティを含むことができる他のタイプがあります。 'DynamicObject'の代わりに' ExpandoObject'を使うことができれば、あなたの人生はもっと簡単になります。 – dasblinkenlight

+0

私が使用しているUIコントロールがExpandoObjectをサポートしているかどうかを確認する必要がありますが、そうであればDynamicObjectからExpandoObjectへの移行に問題はありません。問題は、List でlinqクエリを実行することができますか? – Goran

答えて

1

だけでなく、各オブジェクトのプロパティが不明ではないある限り、内部自身にあなたがそれを行うことができます:私はこのような何かを行いますLINQを行うことができます方法はあります。

あなたはDynamicObjectあなたが実装者はGetDynamicMemberNames()実装を願って、あなたがgetting the property namesためnugetパッケージImpromptuInterfaceのメソッドを使用することができますし、オーバーコントロールを持っていない場合は、動的オブジェクトのすべてのプロパティをテストするための優れた汎用的な方法はありませんdynamically invoking those names

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)); 
3

私はリストで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は、プロセスを作る、彼らは辞書にあったかのようにあなたは、プロパティと値のペアを列挙することができますインタフェースを提供しますそれらをずっと簡単にチェックすることができます。

+0

ExpandoObjectへのポインタありがとう。私は+1を与えていますが、ExpandoObjectから継承することができず、jbtu​​leが直接私の質問に答えたので、回答として受け入れることはできません。 – Goran

関連する問題