67 lines
2.5 KiB
C#
67 lines
2.5 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Reflection;
|
|
|
|
public static class ReflectionUtility
|
|
{
|
|
public static IEnumerable<FieldInfo> GetAllFields(object target, Func<FieldInfo, bool> predicate)
|
|
{
|
|
List<Type> types = new List<Type>()
|
|
{
|
|
target.GetType()
|
|
};
|
|
|
|
while (Enumerable.Last(types).BaseType != null)
|
|
types.Add(Enumerable.Last(types).BaseType);
|
|
|
|
for (int i = types.Count - 1; i >= 0; i--)
|
|
{
|
|
IEnumerable<FieldInfo> fieldInfos = types[i]
|
|
.GetFields(BindingFlags.Instance | BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.DeclaredOnly)
|
|
.Where(predicate);
|
|
|
|
foreach (var fieldInfo in fieldInfos)
|
|
yield return fieldInfo;
|
|
}
|
|
}
|
|
|
|
public static IEnumerable<PropertyInfo> GetAllProperties(object target, Func<PropertyInfo, bool> predicate)
|
|
{
|
|
List<Type> types = new List<Type>()
|
|
{
|
|
target.GetType()
|
|
};
|
|
|
|
while (Enumerable.Last(types).BaseType != null)
|
|
types.Add(Enumerable.Last(types).BaseType);
|
|
|
|
for (int i = types.Count - 1; i >= 0; i--)
|
|
{
|
|
IEnumerable<PropertyInfo> propertyInfos = types[i]
|
|
.GetProperties(BindingFlags.Instance | BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.DeclaredOnly)
|
|
.Where(predicate);
|
|
|
|
foreach (var propertyInfo in propertyInfos)
|
|
yield return propertyInfo;
|
|
}
|
|
}
|
|
|
|
public static IEnumerable<MethodInfo> GetAllMethods(object target, Func<MethodInfo, bool> predicate)
|
|
{
|
|
IEnumerable<MethodInfo> methodInfos = target.GetType()
|
|
.GetMethods(BindingFlags.Instance | BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.Public)
|
|
.Where(predicate);
|
|
|
|
return methodInfos;
|
|
}
|
|
|
|
public static FieldInfo GetField(object target, string fieldName) =>
|
|
GetAllFields(target, f => f.Name.Equals(fieldName, StringComparison.InvariantCulture)).FirstOrDefault();
|
|
|
|
public static PropertyInfo GetProperty(object target, string propertyName) =>
|
|
GetAllProperties(target, p => p.Name.Equals(propertyName, StringComparison.InvariantCulture)).FirstOrDefault();
|
|
|
|
public static MethodInfo GetMethod(object target, string methodName) =>
|
|
GetAllMethods(target, m => m.Name.Equals(methodName, StringComparison.InvariantCulture)).FirstOrDefault();
|
|
} |