2017-01-20 16 views
2

この問題の方向を見つけましたが、この問題に適用できるものが見つかりませんでした。他のプロパティにあるプロパティ値を動的に取得する方法ここで、文

さまざまなタイプのリストを、それらが保持する明示されたプロパティーでフィルタリングしたいと考えています。私はlinqを使ってListをTest.idで動的にフィルタリングすることができますが、MyClass.Nameを通してListをフィルタリングすることはできません。

私はこれらのクラスを持っています。

public class Test 
{ 
    public int Id { get; set; } 
    public MyClass myclass { get; set; } 
} 

public class MyClass 
{ 
    public string Name { get; set; } 
} 

これは私がやろうとしていることです。

static void Main(string[] args) 
{    
    var source = new List<Test> { 
     new Test { Id = 1,myclass = new MyClass() { Name = "bob" } }, 
     new Test { Id = 2,myclass= new MyClass() { Name = "joe" } } }; 

    var x = myFilter(source,"Name", "bob"); 
    Console.WriteLine(x.Count()); 
} 

public static IEnumerable<T> myFilter<T>(List<T> source, string propertyName, string searchString) 
{ 
// get the myclass property then the stated property(Name) value within it 
    searchString = searchString.ToLower(); 
    return source.Where(s => (s.GetType().GetProperty("myclass") 
           .GetType().GetProperty(propertyName) 
           .GetValue(s.GetType().GetProperty("myclass"),null).ToString() ?? " ") 
           .ToLower().Contains(searchString)); 
} 

私はTest.MyClass.Name =「ボブ」 のための1を期待していたカウントの戻り0は、このための解決策はありますか反射以外にそれを行うには良い方法はありますか?あなたが返さmyclass財産のPropertyTypeを使用する必要が

おかげ

答えて

1

public static IEnumerable<T> myFilter<T>(List<T> source, string propertyName, string searchString) 
{ 
    // get the myclass property then the stated property(Name) value within it 
    searchString = searchString.ToLower(); 
    return source.Where(s => (s.GetType().GetProperty("myclass") 
           .PropertyType.GetProperty(propertyName) 
           .GetValue(s.GetType().GetProperty("myclass").GetValue(s)).ToString() ?? " ") 
           .ToLower().Contains(searchString)); 
} 
+1

はそんなにありがとう使用することができる代わりに、テストオブジェクトを返すようにしたい場合は、私はこの上で私の頭をしました。 – Brandon

0

あなたは以下を使用することができるはずです。

var count = source.Count(test => 
          string.Compare(test.myClass.Name, "Bob", 
             StringComparison.CurrentCultureIgnoreCase) == 0); 

これは、文字列値を比較しますNameプロパティの名前で、名前が "bob"に等しい場合にのみカウントされ、大文字と小文字は無視されます。

あなたは、あなたが以下の

var results = source.Where(test => 
          string.Compare(test.myClass.Name, "Bob", 
             StringComparison.CurrentCultureIgnoreCase) == 0); 
関連する問題