程序集包含:類型元數據(描述在代碼中定義的每一類型和成員,二進制形式)。程集元數據(程序集清單、版本號、名稱等)、IL代碼(這些都被裝在exe或dll中)、資源文件。每個程序集都有自己的名稱、版本等信息,這些信息可以通過AssemblyInfo.cs文件來自己定義。
獲取一個類的類型 ?person p=new person(); ?Type ?Type=p.getType();
得到一個類的類型 ?Type type=typeof(Person);
獲取一個類型的父類 ? Type ?type=s.GetType().BaseType;
獲取Person類型的所有方法(不包括私有方法)
Person ?p=new Person(); Type ?personType=p.GetType();
MethodInfo[] ? methods=personType.GetMethods();
foreach(var item in methods)
{
Console.Writeline(item.Name);
}
獲取一個類型的屬性:
PropertyInfo[] ?properties=persontype.GetProperties();
遍歷數組的時候返回的類型為PropertyInfo
獲取一個類型的所有字段:FieldInfo[] ?fields=typeof(Person).GetFiels();返回的類型為FieldInfo
獲取一個類中的所有成員:MemberInfo[] ?members=typePerson.GetMembers();遍歷數組時返回的類型為MemberInfo;
通過反射調用方法:(定義的方法沒有參數)
1.獲取一個類的Type
2.獲取我們要找的方法
3.創建一個該類的對象
4.調用方法
Type ?person=typeof(Person);
MethodInfo ?SayHi=peron.GetMethod("SayHi");
object obj=Activator.CreateInstance(person);
SayHi.Invoke(obj,null);
通過反射調用方法(定義的方法有參數)
Type ?person=typeof(Person);
MethodInfo ?info=person.GetMethod("Say",new Type[]{typeof(string),typeof(string)});
object obj=Activivator.CreateInstance(person);
info.Invoke(obj,new obj[]{"大家好","大壞蛋"});
調用一個帶返回值的方法:
Type personType=typeof(Perosn);
MethodInfo info=personType.GetMethod("Add");//Add方法中返回的是一個int類型的方法
object obj=Activator.CreateInstance(personType);
object objreturn=info.Invoke(obj,new object[]{10,20});
動態加載程序集:
Assembly ?asm=Assembly.LoadFile(@"E:\aa\程序集\程序集\ClassLibrary1\bin\Debug\ClassLibrary1.dll")
獲取程序集中所有類型的Type
Type[] ?types=asm.GetTypes();
獲取所有類型的public 類型的Type
Assembly ?adm=Assembly.LoadFile(文件的絕對路徑);
Type[] publictype=adm.GetExportTypes();
獲取指定的類型
Type typePerson=asm.GetType("ClassLibrary1.Person");
判斷一個類型是否可以被另一個類型實例化
typePerson.IsAssignableForm(typeChinese);
考慮是一個類型是否為另一個類型的子類,返回的結果是一個bool類型
typePerson.IsSubclassOf(typeChinese)
歡迎關注我的公眾號(同步更新文章):DoNet技術分享平臺
閱讀原文