回答
我希望這有助於
通任何名單,並指定屬性名和濾波方法
private IList FilterList(IList list, string propName, Predicate<object> filterMethod) {
var result = new List<object>();
foreach (var item in list) {
var value = item.GetType().GetProperty(propName).GetValue(item);
if (filterMethod(value)) {
result.Add(item);
}
}
return result;
}
例子:
var result = FilterList(list, "Age", age => (int)age >= 18);
你可以開發它,使其充分動態
謝謝@ yousif.aljamri, 如果我事先知道屬性類型,則您的解決方案正在運行。從你的例子中,如果我不把Age放到int中,它就不起作用。 我不知道屬性類型。我如何過濾? –
@BulbulAhmed你的過濾器有多詳細? ,並從它的來源?,如果它是簡單的文本過濾器,它更容易 –
如果列表是通用的,那麼應該在編譯時至少知道一個基類型。
如果基本類型包含屬性 - 只需使用它。
如果只有某些子類型(理想情況下爲一個)包含您感興趣的屬性,則可以在列表上執行cast,然後使用您的屬性。
list.Cast<Derived>().Select(i => i.Property == "val");
如果這是不正常(比如列表的類型有一個包含屬性和其他人不很多派生類型),您可以使用動態與try/catch塊。
list.Select(i => {
try
{
dynamic item = i;
return item.Prop == "value";
}
catch(RuntimeBinderException) //this type doesn't contain the property
{
return false;
}
});
Thanks @Bond, 我只能通過反射知道派生類型。我如何將它轉換爲它的類型列表? –
試試這個。它可以確定列表是否是某種指定類型的列表。基於此,您應該能夠篩選任何特定類型。
public class TypeA
{ }
public class TypeB
{ }
public class GenericFilter
{
public bool IsOfType<T>(IEnumerable<dynamic> objectToInspect)
{
var genericType = objectToInspect.GetType().GenericTypeArguments[0];
return genericType == typeof(T);
}
}
[TestClass]
public class UnitTest1
{
[TestMethod]
public void IdentifiesExpectedType()
{
var classToInspect = new List<TypeA>();
var filter = new GenericFilter();
Assert.IsTrue(filter.IsOfType<TypeA>(classToInspect));
}
[TestMethod]
public void RejectsNonMatchingType()
{
var classToInspect = new List<TypeA>();
var filter = new GenericFilter();
Assert.IsFalse(filter.IsOfType<TypeB>(classToInspect));
}
}
該作品一樣好:
public bool IsOfType<T>(IEnumerable<dynamic> listToFilter)
{
return (listToFilter as IEnumerable<T>) != null;
}
這將名單和他們組的列表爲Dictionary<Type, List<List<dynamic>>
所有每個鍵列表的是那類型。這樣,您可以通過從字典中檢索它們來選擇T類型的列表。
public Dictionary<Type, List<List<dynamic>>> GroupListsByType(List<List<dynamic>> lists)
{
var types = lists.Select(list => list.GetType().GenericTypeArguments[0]).Distinct().ToList();
var grouped = new Dictionary<Type, List<List<dynamic>>>();
types.ForEach(type =>
{
grouped.Add(type, new List<List<dynamic>>());
grouped[type].AddRange(lists.Where(list=>list.GetType().GenericTypeArguments[0] == type));
});
return grouped;
}
(我不是質疑「爲什麼。」我不知道我是否會推薦這一點,但它是有趣的寫。)
- 1. 通過C#反射
- 2. 如何通過反射修改列表
- 3. 如何在C#中通過反射
- 4. 通過反射
- 5. 通過反射
- 6. 通過反射
- 7. 通過反射
- 8. 通過反射
- 9. 通過反射
- 10. 通過反射
- 11. 通過反射
- 12. 通過反射
- 13. C#如何通過反射設置StructLayoutAttribute.Pack?
- 14. 如何通過反射
- 15. 如何通過反射
- 16. 如何通過反射
- 17. 如何從列表過濾通過
- 18. 如何通過int列表中的屬性值過濾列表?
- 19. 如何通過反射過濾類型時過濾<> c_DisplayClass類型?
- 20. ThrowException通過反射
- 21. .NET通過反射
- 22. 通過.NET反射
- 23. 通過反射使用C#與OpenOffice
- 24. 如何通過反射使用BluetoothHeadset類
- 25. 通過反射動態創建通用列表時出錯
- 26. 通過反射和隱式轉換創建通用列表
- 27. 反射來過濾列表<T>
- 28. 如何按返回類型過濾EF過程(例如,通過反射或IL)?
- 29. NHibernate的,通過反射
- 30. 的Java通過反射
你能加你是一個什麼樣的代碼示例試圖做/你試過了什麼? –
您可以使用列表中的'.OfType'按類型進行過濾:'list.OfType()' - 但它不太可能覆蓋您的「通過反射」要求。 –
「項目類型直到運行時才知道」 - 您在運行時用什麼機制來指定項目類型?你怎麼知道類型(在運行時)有你想要的屬性?你對'通用列表'定義的基類型是什麼,或者它只是'var list = new [];'而且你沒有使用正確的術語。包括你的代碼到目前爲止將有助於回答這些問題。 –