天天看點

反射中使用 BindingFlags.IgnoreCase

    我們經常需要通過反射來調用目标對象的方法或擷取/設定目标對象的屬性,Type.InvokeMember 方法簽名如下:

public object InvokeMember(string name,BindingFlags invokeAttr,Binder binder,  object target,object[] args,CultureInfo culture);

    BindingFlags 有個枚舉值是BindingFlags.IgnoreCase ,表示忽略name的大小。我在今天解決一個問題時,就需要用到BindingFlags.IgnoreCase。問題是這樣的,我想根據資料庫列的列名來通過反射從Entity對象中擷取對應的屬性值,大家知道,從Oracle資料庫提取的列名全是大寫的,而Entity中的屬性名是使用的Pascal命名方法,如果不忽略屬性名的大小寫,則反射會失敗。

    于是我像下面的方式擷取屬性:

t.InvokeMember(para.SourceColumn , BindingFlags.IgnoreCase |BindingFlags.GetProperty ,null ,obj ,null) ;

    可是反射失敗了!經過一段時間的嘗試,終于發現BindingFlags.IgnoreCase 需要與BindingFlags.Public和BindingFlags.Instance聯用才會産生效果。    

t.InvokeMember(para.SourceColumn , BindingFlags.Public |BindingFlags.IgnoreCase | BindingFlags.Instance | BindingFlags.GetProperty ,null ,obj ,null) ;

    如此,則可以忽略大小寫來擷取屬性值了。