Beispiel #1
0
        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);
                    }
                }
            }
        }