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; }
}
如有不妥之处,请见谅!

浙公网安备 33010602011771号