[英]LINQ query on PropertyInfo list
我有一個子類,它是從兩個級別的基礎類“派生”的(是正確的詞)。 我有該類中所有屬性的列表(因此包括父級和父級的屬性)。 我想要的只是DeclaringType為“ CrazyNinjaBadger”的屬性(即僅來自我的子類的屬性)。
我已經嘗試過以下語句:
PropertyInfo[] properties = type.GetProperties().Select(x => x.DeclaringType.ToString() == "CrazyNinjaBadger");
但是我得到
“無法將類型'System.Collections.Generic.IEnumerable'隱式轉換為'System.Reflection.PropertyInfo []'。
請有人可以提出一個行之有效的聲明嗎?
用Where
過濾性能,並轉換結果數組:
PropertyInfo[] properties = type.GetProperties()
.Where(x => x.DeclaringType.ToString() == "CrazyNinjaBadger")
.ToArray();
我也相信您想使用類似x.DeclaringType.Name == "CrazyNinjaBadger"
類型名稱。 Btw Select
運算符將屬性設置為布爾值序列(在您的情況下)。 因此,您的查詢實際上返回IEnumerable<bool>
,其類型與CrazyNinjaBadger的字符串類型進行比較。
在行尾添加ToArray()
PropertyInfo[] properties = type.GetProperties()
.Select(x => x.DeclaringType.ToString() == "CrazyNinjaBadger")
.ToArray();
之所以出現該錯誤,是因為Select()
始終返回IEnumerable。
只需.ToArray()
的末尾添加.ToArray()
即可使其工作。
PropertyInfo[] properties = type.GetProperties()
.Select(x => x.DeclaringType.ToString() == "CrazyNinjaBadger")
.ToArray();
需要添加ToArray()才能轉換為Array ...
你快到了! Select返回IEnumerable,但是您試圖設置PropertyInfo數組的值。 您所需要的只是對ToArray的一個附加調用,您就在那里!
PropertyInfo[] properties = type.GetProperties().Select(x => x.DeclaringType.ToString() == "CrazyNinjaBadger").ToArray()
PropertyInfo[] properties = type.GetProperties().Select(x => x.DeclaringType.ToString() == "CrazyNinjaBadger");
Select(...)
返回IEnumerable<T>
。 編譯器錯誤非常明顯。
另一點是您要過濾屬性。 .Select(...)
用於將可枚舉投影到另一個相同或其他類型的對象中。
例如:
IEnumerable<string> strings = new string[] { "0", "1" };
// Converting the string enumerable to an enumerable of integers:
IEnumerable<int> integers = strings.Select(some => int.Parse(some));
// Also, convert each strings into an anonymous object!
IEnumerable<object> whoKnows = strings.Select(some => new { Value = some });
為了過濾可枚舉, 您需要使用.Where(...)
。
另一方面, x.DeclaringType.ToString() == "CrazyNinjaBadger"
是正確的,但它應該是x.DeclaringType.Name == "CrazyNinjaBadger"
(由於Type
具有屬性,因此無需將類型轉換為字符串Name
)。
最后,我認為您不需要在數組中設置結果,您可以這樣做:
IEnumerable<PropertyInfo> properties =
type.GetProperties()
.Where(x => x.DeclaringType.Name == "CrazyNinjaBadger");
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.