Reflection获得类的自定义类型属性的类型

由于项目需要,使用Reflection写了一段程序,用来获取一个类的属性是自定义类或枚举的类型(使用递归来获取任意层次)。

static void Main(string[] args)
{
    string dllPath = @"D:\test\test.dll";
    string classFullName = "TestClass";
    var assembly = Assembly.LoadFile(dllPath);
    var result = GetPropertyClass(assembly, classFullName).Distinct().ToList();
    result.ForEach(p => Console.WriteLine(p));
    Console.Read();
}
static List<string> GetPropertyClass(Assembly assembly, string classFullName)
{
    var result = new List<string>();

    var typeTarget = assembly.GetTypes().FirstOrDefault(p => p.FullName.Equals(classFullName));
    if (typeTarget != null)
    {
        var properties = typeTarget.GetProperties(BindingFlags.Public | BindingFlags.Instance);

        foreach (var p in properties)
        {
            if (p.PropertyType.IsClass || p.PropertyType.IsEnum)
            {
                var propertyTypeName = p.PropertyType.Name;
                var propertyTypeFullName = p.PropertyType.FullName;
                if (p.PropertyType.IsGenericType && p.PropertyType.GenericTypeArguments.Length > 0)
                {
                    //just supports simple List<ClassName>
                    propertyTypeFullName = p.PropertyType.GenericTypeArguments[0].FullName;
                    propertyTypeName = p.PropertyType.GenericTypeArguments[0].Name;
                }
                if (p.PropertyType.IsArray)
                {
                    //just supports single-dimension array
                    propertyTypeFullName = propertyTypeFullName.Replace("[]", string.Empty);
                    propertyTypeName = propertyTypeName.Replace("[]", string.Empty);
                }
                if (propertyTypeFullName.StartsWith("System."))
                {
                    continue;
                }
                var propertyType = assembly.GetType(propertyTypeFullName);
                if (propertyType != null)
                {
                    result.Add(propertyTypeFullName);
                    result.AddRange(GetPropertyClass(assembly, propertyTypeFullName));
                }
            }
        }
    }
    return result;
}

比如以下代码中的Human类,执行结果是:Gender, ContactDetail, Address。(以下几个类仅供测试,结构不一定合理)

   public enum Gender
    {
        Man,
        Woman
    }

    public class Human
    {
        public int Id { get; set; }
        public Gender Gender { get; set; }
        private string name;
        public string Name
        {
            get { return name; }
            set
            {
                name = value;
            }
        }
        private ContactDetail contact;
        public ContactDetail Contact
        {
            get
            {
                return contact;
            }
            set
            {
                contact = value;
            }
        }
        public string[] Notes { get; set; }
        public List<string> Comments { get; set; }
        public DateTime Birthday { get; set; }
        public DayOfWeek ShiftDay { get; set; }
    }
    
    public class ContactDetail
    {
        public List<Address> Addresses { get; set; }
        public string Mobile { get; set; }
        public string Email { get; set; }
    }

    public class Address
    {
        public string Line1 { get; set; }
        public string Line2 { get; set; }
    }

如有不妥之处,请见谅!

posted @ 2016-06-12 15:44  一点一滴,日积月累  阅读(414)  评论(0)    收藏  举报