我在寫乙個有趣的 wpf 軟體可以通過 dll 反射重新生成**,我需要了解dll裡面每個屬性是抽象的還是繼承的還是虛屬性
在 c# 中可以方便通過反射拿到乙個類裡面的所有屬性,在閱讀本文之前,我期望你先看 win10 uwp 反射
需要知道在 c# 中屬性是使用兩個方法做的,乙個是 set 方法乙個是 get 方法,其中 set 方法用來做設定,而 get 方法用來做獲取。但是不一定每個屬性都有 set 和 get 方法,但是至少有乙個。而 c# 中沒有提供任何乙個判斷屬性是否抽象的方法,但是提供了方法的判斷是否抽象。所以可以嘗試獲取某個屬性的 set 或 get 方法是否是抽象方法從而判斷這個屬性是否抽象屬性
假設通過反射拿到了乙個屬性propertyinfo pi
那麼可以通過下面**判斷 set 方法是否是抽象的
if(pi.getsetmethod().isabstract)
如果發現 set 方法是抽象的,那麼這個屬性就是抽象屬性
判斷屬性是虛屬性也是通過屬性的 set 或 get 方法判斷,但是屬性不一定存在 set 或 get 方法,如上面**說的,可以通過 canread 屬性判斷能否讀取,如果能讀取那麼可以用 getmethod 的方法
var m = p.canread ? p.getmethod() : p.setmethod();
if(m.isvirtual)
也就是繼承重寫基類的方法,簡單的判斷就是這個屬性的 set 或 get 方法的定義的類和當前的類不相同
var getmethod = property.getgetmethod();
使用 getbasedefinition 可以嘗試拿到基類的定義,如果能拿到和當前類不同的,那麼這個 get 方法就是繼承的,也就是屬性是重寫的
if (getmethod.getbasedefinition().declaringtype != getmethod.declaringtype)
c# - how to identify abstract members via reflection - stack overflow
c# - how to check if a property is virtual with reflection?
c# - how do i determine if a property was overridden? - stack overflow
作者:林德熙
反射判斷屬性是抽象繼承.html
JavaScript 判斷物件中是否有某屬性
通過點或者方括號可以獲取物件的屬性值,如果物件上不存在該屬性,則會返回undefined。當然,這裡的 不存在 指的是物件自身和原型鏈上都不存在,如果原型鏈有該屬性,則會返回原型鏈上的屬性值。建立物件 let test 獲取物件的自身的屬性 test.name lei test name lei 獲...
JQuery 判斷某個屬性是否存在 hasAttr
在jquery編碼中,我們會判斷元素是否存在某個屬性.比如是否包含 class new 的樣式呢.jquery判斷就非常簡單了,因為有 hasclass這個方法 input name new hasclass new 即可判斷.但是有時候我們需要判斷別的屬性,比如有的 a 鏈結包含 rel 屬性,有...
JQuery 判斷某個屬性是否存在 hasAttr
在jquery編碼中,我們會判斷元素是否存在某個屬性.比如是否包含 class new 的樣式呢.jquery判斷就非常簡單了,因為有 hasclass這個方法 input name new hasclass new 即可判斷.但是有時候我們需要判斷別的屬性,比如有的 a 鏈結包含 rel 屬性,有...