Преобразуйте код, который использует Linq, в код, который не - PullRequest
1 голос
/ 07 августа 2011

Следующий фрагмент кода возвращает массив PropertyInfo объектов, которые имеют определенный атрибут:

var props = t.GetProperties().Where(
                         prop => Attribute.IsDefined(prop, typeof(MyAttribute)));

.
.
Как я могу сделать то же самое в .NET2.0 и, следовательно, без с использованием Linq?

Ответы [ 4 ]

4 голосов
/ 07 августа 2011

1001 * попробовать *

List<PropertyInfo> props = new List<PropertyInfo> ();

foreach (PropertyInfo prop in t.GetProperties())
{
    if ( Attribute.IsDefined(prop, typeof(MyAttribute)) )
         props.Add (prop);
}
3 голосов
/ 07 августа 2011

Классы Array и List<T> предоставляют вам те же функции, что и LINQ.Для этого я бы, вероятно, пошел с:

PropertyInfo[] props = Array.FindAll(t.GetProperties(), 
    delegate(PropertyInfo p) { 
        return Attribute.IsDefined(p, typeof(SerializableAttribute));
    });

или

List<PropertyInfo> props2 = new List<PropertyInfo>(t.GetProperties()).FindAll(
    delegate(PropertyInfo p) {
        return Attribute.IsDefined(p, typeof(SerializableAttribute));
    });
1 голос
/ 07 августа 2011

Я бы использовал LinqBridge для такой задачи.LINQ - это функция времени компиляции C #, а не функция среды выполнения .net.Таким образом, вы можете реплицировать библиотеку в .net 2.0, все еще используя компилятор C # 3.0.

Если вы все же настаиваете:

List<PropertyInfo> l = new List<PropertyInfo>();

foreach(PropertyInfo prop in t.GetProperties())
{
  if(Attribute.IsDefined(prop, typeof(MyAttribute))
    l.Add(prop);
}
0 голосов
/ 07 августа 2011

Если вы используете ReSharper:

http://www.jetbrains.com/resharper/

он может сделать это автоматически.

...