[Unity c#]c#中的反射


什么是反射

在.NET中的反射也可以實現從對象的外部來了解對象(或程序集)內部結構的功能,哪怕你不知道這個對象(或程序集)是個什么東西,另外.NET中的反射還可以運態創建出對象並執行它其中的方法。

反射是.NET中的重要機制,通過反射,可以在運行時獲得程序或程序集中每一個類型(包括類、結構、委托、接口和枚舉等)的成員和成員的信息。有了反射,即可對每一個類型了如指掌。另外我還可以直接創建對象,即使這個對象的類型在編譯時還不知道。 

反射的用途

  (1)使用Assembly定義和加載程序集,加載在程序集清單中列出模塊,以及從此程序集中查找類型並創建該類型的實例。 
    (2)使用Module了解包含模塊的程序集以及模塊中的類等,還可以獲取在模塊上定義的所有全局方法或其他特定的非全局方法。 
    (3)使用ConstructorInfo了解構造函數的名稱、參數、訪問修飾符(如pulic 或private)和實現詳細信息(如abstract或virtual)等。 
    (4)使用MethodInfo了解方法的名稱、返回類型、參數、訪問修飾符(如pulic 或private)和實現詳細信息(如abstract或virtual)等。
    (5)使用FiedInfo了解字段的名稱、訪問修飾符(如public或private)和實現詳細信息(如static)等,並獲取或設置字段值。
    (6)使用EventInfo了解事件的名稱、事件處理程序數據類型、自定義屬性、聲明類型和反射類型等,添加或移除事件處理程序。 
    (7)使用PropertyInfo了解屬性的名稱、數據類型、聲明類型、反射類型和只讀或可寫狀態等,獲取或設置屬性值。 
    (8)使用ParameterInfo了解參數的名稱、數據類型、是輸入參數還是輸出參數,以及參數在方法簽名中的位置等。

反射用到的命名空間

System.Reflection

System.Type

System.Reflection.Assembly

System.Type類

System.Type 類對於反射起着核心的作用。但它是一個抽象的基類,Type有與每種數據類型對應的派生類,我們使用這個派生類的對象的方法、字段、屬性來查找有關該類型的所有信息。

能夠獲取一個給定類型的Type有三種方式.

  ●使用 C# typeof 運算符。
        Type t = typeof(string);


    ●使用對象GetType()方法。
        string s = "grayworm";
        Type t = s.GetType(); 


    ●還可以調用Type類的靜態方法GetType()。
        Type t = Type.GetType("System.String");

Type類的屬性:
       
Name 數據類型名
        FullName 數據類型的完全限定名(包括命名空間名)
        Namespace 定義數據類型的命名空間名
        IsAbstract 指示該類型是否是抽象類型
        IsArray   指示該類型是否是數組
        IsClass   指示該類型是否是類
        IsEnum   指示該類型是否是枚舉
        IsInterface    指示該類型是否是接口
        IsPublic 指示該類型是否是公有的
        IsSealed 指示該類型是否是密封類
        IsValueType 指示該類型是否是值類型


Type類的方法:
       
GetConstructor(), GetConstructors():返回ConstructorInfo類型,用於取得該類的構造函數的信息
        GetEvent(), GetEvents():返回EventInfo類型,用於取得該類的事件的信息
        GetField(), GetFields():返回FieldInfo類型,用於取得該類的字段(成員變量)的信息
        GetInterface(), GetInterfaces():返回InterfaceInfo類型,用於取得該類實現的接口的信息
        GetMember(), GetMembers():返回MemberInfo類型,用於取得該類的所有成員的信息
        GetMethod(), GetMethods():返回MethodInfo類型,用於取得該類的方法的信息
        GetProperty(), GetProperties():返回PropertyInfo類型,用於取得該類的屬性的信息


    可以調用這些成員,其方式是調用Type的InvokeMember()方法,或者調用MethodInfo, PropertyInfo和其他類的Invoke()方法。

System.Type的用法

Type t = typeof(Rubbit);

foreach (ConstructorInfo constructor in t.GetConstructors())
{
     foreach (ParameterInfo parameter in constructor.GetParameters())
     {
          Console.WriteLine(parameter.Name + " : " + parameter.ParameterType.ToString());
     }
}

使用通過反射得到的構造函數變量創建實例對象

//通過Rubbit類名獲取Type變量
Type    t   = typeof(Rubbit);

//設置構造器的參數的類型數組
Type[] pt   = new Type[1];
pt[0] = typeof(int);

//通過類型數組獲取對應的類型的構造器
ConstructorInfo con = t.GetConstructor(pt);

//通過對應的傳遞參數,得到Rubbit的實例對象
object[] pv = { 3 };
Rubbit o = con.Invoke(pv) as Rubbit;

//調用o實例對象的實例方法Description();
o.Description();

   使用Activator Sealed類的靜態CreateInstance方法生成對象

//通過Rubbit類名獲取Type變量
Type    t   = typeof(Rubbit);

//通過對應的傳遞參數,得到Rubbit的實例對象
object[] pv = { 3 };
Rubbit o = Activator.CreateInstance(t,pv) as Rubbit;

//調用o實例對象的實例方法Description();
o.Description();

 查看類中的屬性

//通過Rubbit類名獲取Type變量
Type    t   = typeof(Rubbit);

foreach (PropertyInfo property in t.GetProperties())
{
    //輸出屬性的類型和變量名
    Console.WriteLine(property.Name + " : " + property.PropertyType.ToString());
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM