C#反射的使用方法

一、加载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))//是否存在当前特性类型的特性

 

C#反射的使用方法

上一篇:WPF中的Style(风格,样式)


下一篇:C# delegate的几种用法