1. 程式人生 > >C#反射---屬性

C#反射---屬性

繼承 bstr attr nal lag 數組 詳解 set public

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#反射---屬性