一、加载dll
Assembly assembly = Assembly.LoadFrom("TextDll.dll");//当前程序集需存在这个名字的dll
二、获取类型
Type type = assembly.GetType("TextDll.TestDemo");//获取类型,完成类型名称
三、获取实例
var obj = Activator.CreateInstance(type);//创建对象的实例,默认无参数构造函数
var obj2 = Activator.CreateInstance(type,new object[] { "123"});//创建对象的实例,一个字符串参数的构造方法
obj = Activator.CreateInstance(type,true);//创建对象的实例,使用私有构造方法
四、获取实例方法
var methodInfo = type.GetMethod("Quary");//通过名称获取类型的方法
methodInfo.Invoke(obj, null);//调用方法,静态方法可将实例为null
methodInfo = type.GetMethod("Quary",BindingFlags.Instance|BindingFlags.NonPublic);//实例私有方法
五、获取普通类的泛型方法
var methodInfo = type.GetMethod("Quary");//通过名称获取类型的方法
var methodGeneric = methodInfo.MakeGenericMethod(new Type[] { typeof(int), typeof(string) });//确定方法的参数类型和个数(泛型方法)
methodGeneric.Invoke(obj, new object[] { 1, "Ant编程" });
六、获取泛型类的泛型方法
Assembly assembly = Assembly.LoadFrom("TextDll.dll");//加载Dll,也可以完整路径
Type type = assembly.GetType("TextDll.TestDemo`2");//获取泛型类,类型数量2
var typeNew = type.MakeGenericType(new Type[] { typeof(int), typeof(string) });//确定泛型类的参数类型
var obj = Activator.CreateInstance(typeNew);//创建对象的实例,默认构造方法
var methodInfo = type.GetMethod("Quary");//找到方法
var methodGeneric = methodInfo.MakeGenericMethod(new Type[] { typeof(int), typeof(string) });//确定方法的参数类型和个数(泛型方法)
methodGeneric.Invoke(obj, new object[] { 1, "Ant编程" });
七、获取属性
Assembly assembly = Assembly.LoadFrom("TextDll.dll");//加载Dll,也可以完整路径
Type type = assembly.GetType("TextDll.TestDemo");//获取泛型类,类型数量2
var obj = Activator.CreateInstance(type);//创建对象的实例,默认构造方法
var id = type.GetProperty("ID");
if(id!=null)
{
id.SetValue(obj, 2);
}
PropertyInfo[] propertyInfos = type.GetProperties();//所有属性
八、使用特性
[DebuggerStepThrough] 标记调试跳过改方法
[Required] 标记值不能为空
class AttributeTest
{
public void Test()
{
Type type = typeof(UseAttribute);
var customAttributes = type.GetCustomAttributes(true);
foreach (var item in customAttributes)
{
var defindAttribute = item as DefindAttribute;
if (defindAttribute!=null)
{
Console.WriteLine(defindAttribute.ShowInfo);
}
}
}
}
[Defind("这是一个特性创建")]
class UseAttribute
{
}
class DefindAttribute:Attribute
{
public DefindAttribute(string showInfo)
{
ShowInfo = showInfo;
// Console.WriteLine(showInfo);
}
public string ShowInfo { get; set; }
}
九、使用特性
[AttributeUsage(AttributeTargets.Field)] 约束特性可以标记的位置
if (fileld.IsDefined(typeof(DefindAttribute),true))//是否存在当前特性类型的特性