<PackageReference Include="NUnit" Version="3.6.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 ((object)parameterType == typeof(bool) || parameterType.GetTypeInfo().get_IsEnum()) return true; MemberInfo[] members = TypeExtensions.GetMembers(method.TypeInfo.Type, BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.FlattenHierarchy); foreach (MemberInfo memberInfo in members) { if (CustomAttributeExtensions.IsDefined(memberInfo, typeof(DatapointAttribute), true) && (object)GetTypeFromMemberInfo(memberInfo) == parameterType) return true; if (CustomAttributeExtensions.IsDefined(memberInfo, typeof(DatapointSourceAttribute), true) && (object)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 = TypeExtensions.GetMembers(type2, BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.FlattenHierarchy); foreach (MemberInfo memberInfo in members) { if (CustomAttributeExtensions.IsDefined(memberInfo, typeof(DatapointAttribute), true)) { FieldInfo fieldInfo = memberInfo as FieldInfo; if ((object)GetTypeFromMemberInfo(memberInfo) == type && (object)fieldInfo != null) { if (fieldInfo.IsStatic) list.Add(fieldInfo.GetValue(null)); else list.Add(fieldInfo.GetValue(ProviderCache.GetInstanceOf(type2))); } } else if (CustomAttributeExtensions.IsDefined(memberInfo, typeof(DatapointSourceAttribute), true) && (object)GetElementTypeFromMemberInfo(memberInfo) == type) { FieldInfo fieldInfo2 = memberInfo as FieldInfo; PropertyInfo propertyInfo = memberInfo as PropertyInfo; MethodInfo methodInfo = memberInfo as MethodInfo; if ((object)fieldInfo2 != null) { object obj = fieldInfo2.IsStatic ? null : ProviderCache.GetInstanceOf(type2); foreach (object item in (IEnumerable)fieldInfo2.GetValue(obj)) { list.Add(item); } } else if ((object)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 ((object)methodInfo != null) { object obj = methodInfo.IsStatic ? null : ProviderCache.GetInstanceOf(type2); foreach (object item3 in (IEnumerable)methodInfo.Invoke(obj, new Type[0])) { list.Add(item3); } } } } if (list.Count == 0) { Type underlyingType = Nullable.GetUnderlyingType(type); if ((object)underlyingType != null) type = underlyingType; if ((object)type == typeof(bool)) { list.Add(true); list.Add(false); } else if (type.GetTypeInfo().get_IsEnum()) { foreach (object enumValue in TypeHelper.GetEnumValues(type)) { list.Add(enumValue); } } if (list.Count > 0 && (object)underlyingType != null) list.Add(null); } return list; } private Type GetTypeFromMemberInfo(MemberInfo member) { FieldInfo fieldInfo = member as FieldInfo; if ((object)fieldInfo != null) return fieldInfo.FieldType; PropertyInfo propertyInfo = member as PropertyInfo; if ((object)propertyInfo != null) return propertyInfo.PropertyType; return (member as MethodInfo)?.ReturnType; } private Type GetElementTypeFromMemberInfo(MemberInfo member) { Type typeFromMemberInfo = GetTypeFromMemberInfo(member); if ((object)typeFromMemberInfo == null) return null; if (typeFromMemberInfo.IsArray) return typeFromMemberInfo.GetElementType(); if (typeFromMemberInfo.GetTypeInfo().get_IsGenericType() && typeFromMemberInfo.get_Name() == "IEnumerable`1") return TypeExtensions.GetGenericArguments(typeFromMemberInfo)[0]; return null; } } }