[英]How do I get value from a nested list with reflection?
我有一個稱為filterTarget的嵌套列表。
有關內容的示例:
filterTarget = { Id: 1
InventoryDescription: {Type: "Machine", Code: "1/1", Description: "1", Category: "1", StockCode: "1", …}
InventoryRecordDetails: []
Length: "1"
Life: "04.02.2019"
Location: null
Model: "1" }
該示例我想獲取InventoryDescription代碼的值。
我寫了兩層代碼,但是看起來很臟而且不夠用。 這不是一般的。
filterTarget = filterTarget
.Where(x => x.GetType()
.GetProperty(fieldval1)
.PropertyType
.GetProperty(fieldval2)
.GetValue(x.GetType()
.GetProperty(fieldval1)
.GetValue(x))
.ToString()?
.ToLower() == deger)
.ToList();
如何從帶有反射和linq的嵌套列表中獲取價值?
如果你正在尋找一個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());
}
}
filterTarget是我的嵌套列表。
字段是有序屬性字符串。
filterTarget = (from f in filterTarget
let temp = GetPropertyValue(f, Field)
where temp?.ToString().ToLower() == "deger"
select f).ToList();
private static object GetPropertyValue<T>(T filterTarget, string field)
{
string[] fields = field.Split('.');
object value = filterTarget;
fields?.ToList().ForEach(p =>
{
value = value.GetType().GetProperty(p).GetValue(value);
});
return value;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.