Отфильтруйте общий список на основе отраженного значения его записей с помощью linq - PullRequest
1 голос
/ 08 марта 2012

У меня есть общий список объектов, из которых я хочу сократить значение на основе отраженного в нем значения

List<MyCaseObj> CasesInGroup = ....;
PropertyInfo piItem = typeof(MyCaseObj).GetProperty(SomePropertyName).PropertyType.GetProperty(SomeValueMemberName);

    var CasesToProcess = (from csh in CasesInGroup 
        where ((Guid)piItem.GetValue(piField.GetValue(csh, null), null))
            .In(fld.Items.Select(i => i.ItemID)) 
                select csh);

, однако выясняется, что конкретное значение иногда может быть нулевым, а расширение In -не увлекаться этим броском «Нестатический метод требует цели».исключение

добавление && (Guid) piItem.GetValue (piField.GetValue (csh, null), null)! = null не работает, и в любом случае дважды делает отражение, что на первый взгляд кажется неправильнымдаже если это произойдет ... кто-то может объяснить, как обойти это, или, может быть, просто более хороший способ сделать это в первую очередь.

любая помощь, указатели или что-то подобное будет с благодарностью получен

спасибо

1 Ответ

1 голос
/ 08 марта 2012

Вы можете заменить

(Guid)piItem.GetValue(piField.GetValue(csh, null), null))

на

(csh != null ? (Guid)piItem.GetValue(piField.GetValue(csh, null), null)) : Guid.Empty)

, который должен работать, если Items иногда не содержит Guid.Empty.

PS.изучая что-то очень, очень крутое, преобразуйте это выражение в лямбду:

var myCaseType = typeof(MyCaseObj);
var param = Expression.Parameter(myCaseType);
var cond = Expression.Condition(
    Expression.NotEqual(param, Expression.Constant(null, myCaseType))
,   Expression.Property(param, "SomePropertyName")
,   Expression.Constant(Guid.Empty)
);
var lambda = (Func<MyCaseObj,Guid>)Expression.Lambda(cond, param).Compile();

Теперь вы можете переписать ваш выбор следующим образом:

var CasesToProcess = (from csh in CasesInGroup 
    where lambda(csh)In(fld.Items.Select(i => i.ItemID)) 
    select csh);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...