public void Type_GetMember() { Type typeBar = typeof(Bar); Type typeFoo = typeof(Foo); var expectedFields = new[] { new { Name = "_field1", MemberType = MemberTypes.Field, Flags = BindingFlags.Instance | BindingFlags.NonPublic, Length = 1, Members = new[] { new { Type = typeof(FieldInfo), MemberType = MemberTypes.Field, Parameters = new Type[0] } } }, new { Name = "_field2", MemberType = MemberTypes.Field, Flags = BindingFlags.Instance | BindingFlags.NonPublic, Length = 1, Members = new[] { new { Type = typeof(FieldInfo), MemberType = MemberTypes.Field, Parameters = new Type[0] } } }, new { Name = "_field3", MemberType = MemberTypes.Field, Flags = BindingFlags.Instance | BindingFlags.NonPublic, Length = 0, Members = new [] { new { Type = (Type)null, MemberType = (MemberTypes)0, Parameters = new Type[0] } } }, new { Name = "_field1", MemberType = MemberTypes.Property, Flags = BindingFlags.Instance | BindingFlags.NonPublic, Length = 0, Members = new [] { new { Type = (Type)null, MemberType = (MemberTypes)0, Parameters = new Type[0] } } }, new { Name = "_field1", MemberType = MemberTypes.All, Flags = BindingFlags.Instance | BindingFlags.NonPublic, Length = 1, Members = new[] { new { Type = typeof(FieldInfo), MemberType = MemberTypes.Field, Parameters = new Type[0] } } }, new { Name = "Field1", MemberType = MemberTypes.Property, Flags = BindingFlags.Instance | BindingFlags.Public, Length = 1, Members = new[] { new { Type = typeof(PropertyInfo), MemberType = MemberTypes.Property, Parameters = new Type[0] } } }, new { Name = "Field2", MemberType = MemberTypes.Property, Flags = BindingFlags.Instance | BindingFlags.Public, Length = 1, Members = new[] { new { Type = typeof(PropertyInfo), MemberType = MemberTypes.Property, Parameters = new Type[0] } } }, new { Name = "Field3", MemberType = MemberTypes.Property, Flags = BindingFlags.Instance | BindingFlags.Public, Length = 0, Members = new[] { new { Type = (Type)null, MemberType = (MemberTypes)0, Parameters = new Type[0] } } }, new { Name = "Field1", MemberType = MemberTypes.Method, Flags = BindingFlags.Instance | BindingFlags.Public, Length = 0, Members = new[] { new { Type = (Type)null, MemberType = (MemberTypes)0, Parameters = new Type[0] } } }, new { Name = "SetField1", MemberType = MemberTypes.Method, Flags = BindingFlags.Instance | BindingFlags.Public, Length = 2, Members = new[] { new { Type = typeof(MethodInfo), MemberType = MemberTypes.Method, Parameters = new Type[] { typeof(int) } }, new { Type = typeof(MethodInfo), MemberType = MemberTypes.Method, Parameters = new Type[] { typeof(int), typeof(bool) } } } }, new { Name = "SetField2", MemberType = MemberTypes.Method, Flags = BindingFlags.Instance | BindingFlags.Public, Length = 1, Members = new[] { new { Type = typeof(MethodInfo), MemberType = MemberTypes.Method, Parameters = new Type[] { typeof(string) } } } }, new { Name = "SetField3", MemberType = MemberTypes.Method, Flags = BindingFlags.Instance | BindingFlags.Public, Length = 0, Members = new [] { new { Type = (Type)null, MemberType = (MemberTypes)0, Parameters = new Type[0] } } }, new { Name = "DoNothing", MemberType = MemberTypes.Field | MemberTypes.Property | MemberTypes.Method, Flags = BindingFlags.Instance | BindingFlags.Public, Length = 1, Members = new[] { new { Type = typeof(MethodInfo), MemberType = MemberTypes.Method, Parameters = new Type[0] } } }, }; foreach (var item in expectedFields) { var members = Type2.GetMember( typeBar, item.Name, item.MemberType, item.Flags); Assert.IsNotNull(members); Assert.AreEqual(item.Length, members.Length); for (int i = 0; i < item.Length; i++) { Assert.IsTrue(item.Members[i].Type.IsAssignableFrom(members[i].GetType())); Assert.AreEqual(item.Members[i].MemberType, members[i].MemberType); Assert.AreEqual(item.Name, members[i].Name); Assert.AreEqual(typeBar, members[i].DeclaringType); if (item.Members[i].Type != typeof(MethodInfo)) { continue; } ParameterInfo[] parameters = ((MethodInfo)members[i]).GetParameters(); Assert.IsNotNull(parameters); Assert.AreEqual(item.Members[i].Parameters.Length, parameters.Length); for (int j = 0; j < parameters.Length; j++) { Assert.AreEqual(item.Members[i].Parameters[j], parameters[j].ParameterType); } } } }