<PackageReference Include="NUnit" Version="3.0.0-alpha" />

DatapointProvider

Provides data from fields marked with the DatapointAttribute or the DatapointsAttribute.
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(ParameterInfo parameter) { Type parameterType = parameter.ParameterType; MemberInfo member = parameter.Member; Type reflectedType = member.ReflectedType; if (!member.IsDefined(typeof(TheoryAttribute), true)) return false; if (parameterType == typeof(bool) || parameterType.IsEnum) return true; MemberInfo[] members = reflectedType.GetMembers(BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic); 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(ParameterInfo parameter) { List<object> list = new List<object>(); Type parameterType = parameter.ParameterType; Type reflectedType = parameter.Member.ReflectedType; MemberInfo[] members = reflectedType.GetMembers(BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic); foreach (MemberInfo memberInfo in members) { if (memberInfo.IsDefined(typeof(DatapointAttribute), true)) { if (GetTypeFromMemberInfo(memberInfo) == parameterType && memberInfo.MemberType == MemberTypes.Field) { FieldInfo fieldInfo = memberInfo as FieldInfo; if (fieldInfo.IsStatic) list.Add(fieldInfo.GetValue(null)); else list.Add(fieldInfo.GetValue(ProviderCache.GetInstanceOf(reflectedType))); } } else if (memberInfo.IsDefined(typeof(DatapointSourceAttribute), true) && GetElementTypeFromMemberInfo(memberInfo) == parameterType) { switch (memberInfo.MemberType) { case MemberTypes.Field: { FieldInfo fieldInfo2 = memberInfo as FieldInfo; object obj = fieldInfo2.IsStatic ? null : ProviderCache.GetInstanceOf(reflectedType); foreach (object item in (IEnumerable)fieldInfo2.GetValue(obj)) { list.Add(item); } break; } case MemberTypes.Property: { PropertyInfo propertyInfo = memberInfo as PropertyInfo; MethodInfo getMethod = propertyInfo.GetGetMethod(true); object obj = getMethod.IsStatic ? null : ProviderCache.GetInstanceOf(reflectedType); foreach (object item2 in (IEnumerable)propertyInfo.GetValue(obj, null)) { list.Add(item2); } break; } case MemberTypes.Method: { MethodInfo methodInfo = memberInfo as MethodInfo; object obj = methodInfo.IsStatic ? null : ProviderCache.GetInstanceOf(reflectedType); foreach (object item3 in (IEnumerable)methodInfo.Invoke(obj, new Type[0])) { list.Add(item3); } break; } } } } if (list.Count == 0) { if (parameterType == typeof(bool)) { list.Add(true); list.Add(false); } else if (parameterType.IsEnum) { foreach (object enumValue in TypeHelper.GetEnumValues(parameterType)) { list.Add(enumValue); } return list; } } return list; } private Type GetTypeFromMemberInfo(MemberInfo member) { switch (member.MemberType) { case MemberTypes.Field: return ((FieldInfo)member).FieldType; case MemberTypes.Property: return ((PropertyInfo)member).PropertyType; case MemberTypes.Method: return ((MethodInfo)member).ReturnType; default: return null; } } private Type GetElementTypeFromMemberInfo(MemberInfo member) { Type typeFromMemberInfo = GetTypeFromMemberInfo(member); if (typeFromMemberInfo == (Type)null) return null; if (typeFromMemberInfo.IsArray) return typeFromMemberInfo.GetElementType(); if (typeFromMemberInfo.IsGenericType && typeFromMemberInfo.Name == "IEnumerable`1") return typeFromMemberInfo.GetGenericArguments()[0]; return null; } } }