1

私はリフレクションを初めて使用するので、初心者の質問を許してください。Generic List と String の 2 つのパラメーターを受け取り、その List 内でプロパティ値が文字列と一致するすべての項目を検索するメソッドを作成するにはどうすればよいですか。

たとえば、3 つのプロパティを持つオブジェクトがあるとします。このオブジェクトのリストをメソッドと検索文字列に渡すと、プロパティのいずれかに検索文字列が含まれるオブジェクトのリストが返されます。

私はこのようにすることができます:

var temp = list.AsQueryable().Where("SomeField == 1").Select("it");

しかし、オブジェクトのリストを渡すことができるように、このメソッドをジェネリックにするにはどうすればよいでしょうか?

前もって感謝します...

4

5 に答える 5

1

Type.GetProperties()オブジェクトのすべてのプロパティを取得するために使用します。PropertyInfo.GetValue()特定のオブジェクトの特定のプロパティの値を取得するために使用します。文字列を DateTime、数値、またはその他の複雑なオブジェクトに一致させる方法を理解する必要があります。のような関数にすべて入れてくださいbool IsMatch(this object obj, string val)。次に、リストを次のようにフィルタリングできますlist.Where(x => x.IsMatch("something"))

于 2013-12-13T15:17:57.373 に答える
1

Dynamic Linqを使用している場合は、これを試してください

public static IEnumerable<T> Filter<T>(IEnumerable<T> source, string searchStr)
{
    var propsToCheck = typeof (T).GetProperties().Where(a => a.PropertyType == typeof(string));

    var filter = propsToCheck.Aggregate(string.Empty, (s, p) => (s == string.Empty ? string.Empty : string.Format("{0} OR ", s)) + string.Format("{0} == @0", p.Name));

    var filtered = source.AsQueryable().Where(filter, searchStr);
    return filtered;
}
于 2013-12-13T15:41:17.607 に答える
0

プロパティを引数と同じ型に一致させたい場合は、この拡張メソッドが役立ちます。

 public static class ListExtensions
{
    public static IEnumerable<T> MatchWithAnyProperty<T, TK>(this IEnumerable<T> list, TK value)
    {
        var argType = typeof (TK);
        var properties = typeof(T).GetProperties().Where(x => x.PropertyType.IsAssignableFrom(argType));

      return  list.Where(item => properties.Any(prop =>
            {
                var propertyValue = prop.GetValue(item, null);
                if (value == null)
                    return propertyValue == null;
                return propertyValue.Equals(value);
            }));
    }
}

これは、次のように使用できます。

var items = new[]
            {
                new
                    {
                        Name = "Test",
                        Age = 20,
                        Test=25
                    },
                new
                    {
                        Name = "Hello",
                        Age = 10,
                        Test=15
                    },
                new
                    {
                        Name = "T2gdhest",
                        Age = 14,
                        Test=20
                    },
                new
                    {
                        Name = "hai",
                        Age = 33,
                        Test=10
                    },
                new
                    {
                        Name = "why not",
                        Age = 10,
                        Test=33
                    },
            };

       var match= items.MatchWithAnyProperty(10);

        foreach (var item in match)
        {
            Console.WriteLine(item.Name);
        }
        Console.ReadKey();
于 2013-12-13T15:34:41.483 に答える