2016-04-03 8 views
0

一般的なリストがあります。リストアイテムのプロパティの値に基づいてリストをフィルタリングする必要があります。アイテムタイプは実行時まで認識されません。Cでリフレクトでジェネリックリストをフィルタリングする方法

私はリフレクションでアイテムの種類を見つけてフィルタリングする必要があります。

私はどんなアイデアや例でも助けてください

ありがとうございます。リストは、一般的な場合には

+0

あなたがしているもののコード例を追加することができますあなたは何をしようとしていますか? –

+0

あなたはあなたのリスト上の.OfType'はタイプによってフィルタリングするために使用することができます ':' list.OfType () ' - それはあなたの「反射による」要件をカバーしているそうです。 –

+0

"実行時までアイテムタイプがわかりません" - 実行時にアイテムタイプを指定するためにどのようなメカニズムを使用していますか?あなたは、タイプ(実行時に)あなたが望むプロパティを持っていることをどのように知っていますか? 'generic list'に対して定義された基底型は何ですか?それとも、 'var list = new [];'だけなのか、あなたは正しい用語を使用していません。これまでのコードを含めれば、これらの質問に答えるのに役立ちます。 –

答えて

1

:あなたはそれを開発することができ

var result = FilterList(list, "Age", age => (int)age >= 18); 

をし、完全に動的にする。

+0

ありがとう@ yousif.aljamri、 私は事前にプロパティの種類を知っているあなたのソリューションは動作しています。あなたの例から、私がAgeをintにキャストしなければ、それは機能しません。 私は事前に不動産タイプを知らない。どうすればフィルタリングできますか? –

+0

@ BulbulAhmedあなたのフィルターの詳細は? 、どこから来るのか、単純なテキストフィルタなら簡単です –

1

あなたはコンパイル時に、少なくとも基本型を知っている必要があります。

ベースタイプにプロパティが含まれている場合は、それを使用してください。

サブタイプの一部(理想的には1つ)に興味のあるプロパティが含まれている場合は、castをリストに追加してプロパティを使用できます。それがOKでない場合

list.Cast<Derived>().Select(i => i.Property == "val"); 

は、あなたがtry/catchブロックでダイナミックを使用することができます(リストのタイプがいないプロパティなどが含まれている多くの派生型を持っていると言います)。私はこのヘルプ

 private IList FilterList(IList list, string propName, Predicate<object> filterMethod) { 
     var result = new List<object>(); 
     foreach (var item in list) { 
      var value = item.GetType().GetProperty(propName).GetValue(item); 
      if (filterMethod(value)) { 
       result.Add(item); 
      } 
     } 
     return result; 

    } 

例任意のリストを渡すと、プロパティ名を指定して、フィルタ法ホープ

list.Select(i => { 
        try 
        { 
         dynamic item = i; 
         return item.Prop == "value"; 
        } 
        catch(RuntimeBinderException) //this type doesn't contain the property 
        { 
         return false; 
        } 
       }); 
+0

ありがとう@Bond、 派生型はリフレクションによってしか知ることができません。どのようにそれをそのタイプのリストにキャストすることができますか? –

0

これを試してください。 Listが特定の型のリストであるかどうかを判断できます。それに基づいて、特定のタイプのフィルタリングが可能でなければなりません。

public class TypeA 
{ } 
public class TypeB 
{ } 

public class GenericFilter 
{ 
    public bool IsOfType<T>(IEnumerable<dynamic> objectToInspect) 
    { 
     var genericType = objectToInspect.GetType().GenericTypeArguments[0]; 
     return genericType == typeof(T); 
    } 
} 


[TestClass] 
public class UnitTest1 
{ 
    [TestMethod] 
    public void IdentifiesExpectedType() 
    { 
     var classToInspect = new List<TypeA>(); 
     var filter = new GenericFilter(); 
     Assert.IsTrue(filter.IsOfType<TypeA>(classToInspect)); 
    } 

    [TestMethod] 
    public void RejectsNonMatchingType() 
    { 
     var classToInspect = new List<TypeA>(); 
     var filter = new GenericFilter(); 
     Assert.IsFalse(filter.IsOfType<TypeB>(classToInspect)); 
    } 
} 

これは、同じようにうまく機能:

public bool IsOfType<T>(IEnumerable<dynamic> listToFilter) 
{ 
    return (listToFilter as IEnumerable<T>) != null; 
} 

これは、各キーのリストのすべてがそのことをしているDictionary<Type, List<List<dynamic>>にリストやグループ、それらのリストを取りますタイプ。そうすれば、タイプTのリストを辞書から取り出すことができます。

public Dictionary<Type, List<List<dynamic>>> GroupListsByType(List<List<dynamic>> lists) 
    { 
     var types = lists.Select(list => list.GetType().GenericTypeArguments[0]).Distinct().ToList(); 
     var grouped = new Dictionary<Type, List<List<dynamic>>>(); 
     types.ForEach(type => 
     { 
      grouped.Add(type, new List<List<dynamic>>()); 
      grouped[type].AddRange(lists.Where(list=>list.GetType().GenericTypeArguments[0] == type)); 
     }); 
     return grouped; 
    } 

(私は「なぜ」私はこれをお勧めします場合、私は知りませんが、それは書くために面白いを問うていないよ。)

関連する問題