Если вы ищете решение linq, тогда let
будет вашим другом:
filterTarget = (from f in filterTarget
let temp = f.GetType().GetProperty(fieldval1).GetValue(f)
let temp2 = temp.GetType().GetProperty(fieldval2).GetValue(temp)
where temp2.ToString().ToLower() == deger
select f).ToList();
Но лично я нахожу его нечитаемым.Нормальный цикл с подходящим условием if был бы гораздо более понятен:
public IEnumerable<T> FilterMyList<T>(IEnumerable<T> list, string fieldval1, string fieldval2, string deger)
{
foreach (var element in list)
{
var nesteValue1 = element.GetType().GetProperty(fieldval1).GetValue(element);
var nestedValue2 = nesteValue1.GetType().GetProperty(fieldval2).GetValue(nesteValue1);
if (nestedValue2.ToString().ToLower() == deger)
{
yield return element;
}
}
}
Вот более общий способ, который использует рекурсию для погружения в ваш вложенный объект.Вам необходимо указать точное количество имен свойств, и оно должно соответствовать уровням вложенности:
public IEnumerable<T> FilterMyListRecursive<T>(IEnumerable<T> list, string searchpattern, params string [] propertynames) where T: class
{
foreach (var element in list)
{
if (TryNestedRecursiveDescend(element, searchpattern, propertynames))
{
yield return element;
}
}
}
private bool TryNestedRecursiveDescend<T>(T obj, string searchpattern, params string [] propertynames) where T: class
{
var nestedValue = obj.GetType().GetProperty(propertynames.First()).GetValue(obj);
// if you are at the lowest level that you can check
if (fieldvalues.Length == 1)
{
return nestedValue.ToString().ToLower() == searchpattern;
}
else
{
// recursive call with the remaining propertynames
return TryNestedDescend(nestedValue, searchpattern, propertynames.Skip(1).ToArray());
}
}