C#反射---屬性
C#反射詳解
(1)反射獲取屬性
先講解一下獲取的反射屬性的一些枚舉參數的含義:BindingFlags
Instance|Public:獲取公共的的實例屬性(非靜態的) Instance|NonPublic:獲取非公共的的實例屬性(非靜態的)。(private/protect/internal) Static|Public:獲取公共的靜態屬性 Static|NonPublic:獲取非公共的靜態屬性。(private/protect/internal) Instance|Static|Public:獲取公共的的實例或靜態屬性 Instance|Static|NonPublic:非獲取公共的的實例或靜態屬性
官方解釋:為了獲取返回值,必須指定 BindingFlags.Instance 或 BindingFlags.Static。
指定 BindingFlags.Public 可在搜索中包含公共成員。
指定 BindingFlags.NonPublic 可在搜索中包含非公共成員(即私有成員和受保護的成員)。
指定 BindingFlags.FlattenHierarchy 可包含層次結構上的靜態成員。
下列 BindingFlags 修飾符標誌可用於更改搜索的執行方式:
BindingFlags.IgnoreCase,表示忽略 name 的大小寫。
BindingFlags.DeclaredOnly,僅搜索 Type 上聲明的成員,而不搜索被簡單繼承的成員。
可以使用下列 BindingFlags 調用標誌表示要對成員采取的操作:
CreateInstance,表示調用構造函數。忽略 name。對其他調用標誌無效。
InvokeMethod,表示調用方法,而不調用構造函數或類型初始值設定項。對 SetField 或 SetProperty 無效。
GetField,表示獲取字段值。對 SetField 無效。
SetField,表示設置字段值。對 GetField 無效。
GetProperty,表示獲取屬性。對 SetProperty 無效。
SetProperty 表示設置屬性。對 GetProperty 無效。
BindingFlags.Instance : 對象實例
BindingFlags.Static : 靜態成員
BindingFlags.Public : 指可在搜索中包含公共成員
BindingFlags.NonPublic : 指可在搜索中包含非公共成員(即私有成員和受保護的成員)
BindingFlags.FlattenHierarchy : 指可包含層次結構上的靜態成員
BindingFlags.IgnoreCase : 表示忽略 name 的大小寫
BindingFlags.DeclaredOnly : 僅搜索 Type 上聲明的成員,而不搜索被簡單繼承的成員
BindingFlags.CreateInstance : 表示調用構造函數。忽略 name。對其他調用標誌無效
獲取屬性的方法 直接從微軟源碼庫裏拿到
public PropertyInfo[] GetProperties();//直接獲取屬性裏所有公共屬性,包括繼承過來的公有屬性 public abstract PropertyInfo[] GetProperties(BindingFlags bindingAttr);//按照屬性的級別獲取對應的屬性,比如獲取公有的私有的靜態的屬性等等,包括繼承來的protected和internal
public PropertyInfo GetProperty(string name);//按著屬性名稱獲取公有屬性,區分大小寫
public PropertyInfo GetProperty(string name, BindingFlags bindingAttr);//按著指定名稱和BindingFlags條件篩選
public PropertyInfo GetProperty(string name, Type returnType);//按著指定名稱和返回值的Type類型獲取屬性,公有屬性。如果沒有就返回Null
public PropertyInfo GetProperty(string name, Type[] types);//獲得指定名稱或者屬性參數的類型數組,若為屬性,則用new Type[]{}或者new Type[0],如果為索引屬性,則正常Type數組,公有屬性
索引器的名稱用 "Item"
public PropertyInfo GetProperty(string name, Type returnType, Type[] types);//根據指定的名稱和返回類型以及參數的Type類型數組獲取屬性
public PropertyInfo GetProperty(string name, Type returnType, Type[] types, ParameterModifier[] modifiers);//默認的最後一個參數為null
public PropertyInfo GetProperty(string name, BindingFlags bindingAttr, Binder binder, Type returnType, Type[] types, ParameterModifier[] modifiers);//默認的最後參數為Null
獲得屬性後給屬性 賦值,從微軟獲得的源碼
PropertyInfo pi = t.GetProperty("sex");//獲取實例的sex屬性 Object obj = pi.GetValue(my,null);獲取該屬性的值
public virtual object GetValue(object obj, object[] index);///獲取屬性的值,其中index是針對索引器多參數現象,如不是索引器,則為Null
public abstract object GetValue(object obj, BindingFlags invokeAttr, Binder binder, object[] index, CultureInfo culture);//獲取對應屬性的值
public virtual void SetValue(object obj, object value, object[] index);//給某個實例對象賦屬性值
public abstract void SetValue(object obj, object value, BindingFlags invokeAttr, Binder binder, object[] index, CultureInfo culture);
C#反射---屬性