Like GetType (). GetFields with a custom attribute?

this old code returns a list of fields decorated with an attribute in a method call using reflection

Is there a way to replace it with TypeDescripter or LINQ?

public static FieldInfo[] GetFieldsWithAttribute(Type type, Attribute attr, bool onlyFromType) { System.Reflection.FieldInfo[] infos = type.GetFields(); int cnt = 0; foreach (System.Reflection.FieldInfo info in infos) { if (info.GetCustomAttributes(attr.GetType(), false).Length > 0) { if (onlyFromType && info.DeclaringType != type) continue; cnt++; } } System.Reflection.FieldInfo[] rc = new System.Reflection.FieldInfo[cnt]; // now reset ! cnt = 0; foreach (System.Reflection.FieldInfo info in infos) { if (info.GetCustomAttributes(attr.GetType(), false).Length > 0) { if (onlyFromType && info.DeclaringType != type) continue; rc[cnt++] = info; } } return rc; } 
+4
source share
2 answers
 public static FieldInfo[] GetFieldsWithAttribute(Type type, Attribute attr, bool onlyFromType) { System.Reflection.FieldInfo[] infos = type.GetFields(); var selection = infos.Where(info => (info.GetCustomAttributes(attr.GetType(), false).Length > 0) && ((!onlyFromType) || (info.DeclaringType == type))); return selection.ToArray(); } 

Note that if you possibly return IEnumerable, then you can directly return the selection.

+3
source

What about:

 return type .GetFields() .Where(fi => fi.GetCustomAttributes(attr.GetType(), false).Length > 0 && !(onlyFromType && fi.DeclaringType != type)) .ToArray(); 
+1
source

Source: https://habr.com/ru/post/1384191/


All Articles