<PackageReference Include="NUnit" Version="3.11.0" />

DatapointProvider

Provides data from fields marked with the DatapointAttribute or the DatapointsAttribute.
using NUnit.Compatibility; using NUnit.Framework.Interfaces; using System; using System.Collections; using System.Collections.Generic; using System.Reflection; namespace NUnit.Framework.Internal.Builders { public class DatapointProvider : IParameterDataProvider { public bool HasDataFor(IParameterInfo parameter) { IMethodInfo method = parameter.Method; if (!method.IsDefined<TheoryAttribute>(true)) return false; Type parameterType = parameter.ParameterType; if (parameterType == typeof(bool) || TypeExtensions.GetTypeInfo(parameterType).IsEnum) return true; MemberInfo[] members = method.TypeInfo.Type.GetMembers(BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.FlattenHierarchy); foreach (MemberInfo memberInfo in members) { if (memberInfo.IsDefined(typeof(DatapointAttribute), true) && GetTypeFromMemberInfo(memberInfo) == parameterType) return true; if (memberInfo.IsDefined(typeof(DatapointSourceAttribute), true) && GetElementTypeFromMemberInfo(memberInfo) == parameterType) return true; } return false; } public IEnumerable GetDataFor(IParameterInfo parameter) { List<object> list = new List<object>(); Type type = parameter.ParameterType; Type type2 = parameter.Method.TypeInfo.Type; MemberInfo[] members = type2.GetMembers(BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.FlattenHierarchy); foreach (MemberInfo memberInfo in members) { if (memberInfo.IsDefined(typeof(DatapointAttribute), true)) { FieldInfo fieldInfo = memberInfo as FieldInfo; if (GetTypeFromMemberInfo(memberInfo) == type && fieldInfo != (FieldInfo)null) { if (fieldInfo.IsStatic) list.Add(fieldInfo.GetValue(null)); else list.Add(fieldInfo.GetValue(ProviderCache.GetInstanceOf(type2))); } } else if (memberInfo.IsDefined(typeof(DatapointSourceAttribute), true) && GetElementTypeFromMemberInfo(memberInfo) == type) { FieldInfo fieldInfo2 = memberInfo as FieldInfo; PropertyInfo propertyInfo = memberInfo as PropertyInfo; MethodInfo methodInfo = memberInfo as MethodInfo; if (fieldInfo2 != (FieldInfo)null) { object obj = fieldInfo2.IsStatic ? null : ProviderCache.GetInstanceOf(type2); foreach (object item in (IEnumerable)fieldInfo2.GetValue(obj)) { list.Add(item); } } else if (propertyInfo != (PropertyInfo)null) { object obj = propertyInfo.GetGetMethod(true).IsStatic ? null : ProviderCache.GetInstanceOf(type2); foreach (object item2 in (IEnumerable)propertyInfo.GetValue(obj, null)) { list.Add(item2); } } else if (methodInfo != (MethodInfo)null) { object obj = methodInfo.IsStatic ? null : ProviderCache.GetInstanceOf(type2); MethodInfo methodInfo2 = methodInfo; object obj2 = obj; object[] parameters = new Type[0]; foreach (object item3 in (IEnumerable)methodInfo2.Invoke(obj2, parameters)) { list.Add(item3); } } } } if (list.Count == 0) { Type underlyingType = Nullable.GetUnderlyingType(type); if (underlyingType != (Type)null) type = underlyingType; if (type == typeof(bool)) { list.Add(true); list.Add(false); } else if (TypeExtensions.GetTypeInfo(type).IsEnum) { foreach (object value in Enum.GetValues(type)) { list.Add(value); } } if (list.Count > 0 && underlyingType != (Type)null) list.Add(null); } return list; } private Type GetTypeFromMemberInfo(MemberInfo member) { FieldInfo fieldInfo = member as FieldInfo; if (fieldInfo != (FieldInfo)null) return fieldInfo.FieldType; PropertyInfo propertyInfo = member as PropertyInfo; if (propertyInfo != (PropertyInfo)null) return propertyInfo.PropertyType; MethodInfo methodInfo = member as MethodInfo; if (methodInfo != (MethodInfo)null) return methodInfo.ReturnType; return null; } private Type GetElementTypeFromMemberInfo(MemberInfo member) { Type typeFromMemberInfo = GetTypeFromMemberInfo(member); if (typeFromMemberInfo == (Type)null) return null; if (typeFromMemberInfo.IsArray) return typeFromMemberInfo.GetElementType(); if (TypeExtensions.GetTypeInfo(typeFromMemberInfo).IsGenericType && typeFromMemberInfo.Name == "IEnumerable`1") return typeFromMemberInfo.GetGenericArguments()[0]; return null; } } }