我在写一个有趣的 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


本文会经常更新,请阅读原文: https://blog.lindexi.com/post/C-%E5%8F%8D%E5%B0%84%E5%88%A4%E6%96%AD%E5%B1%9E%E6%80%A7%E6%98%AF%E6%8A%BD%E8%B1%A1%E7%BB%A7%E6%89%BF.html ,以避免陈旧错误知识的误导,同时有更好的阅读体验。

如果你想持续阅读我的最新博客,请点击 RSS 订阅,推荐使用RSS Stalker订阅博客,或者前往 CSDN 关注我的主页

知识共享许可协议 本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。欢迎转载、使用、重新发布,但务必保留文章署名林德熙(包含链接: https://blog.lindexi.com ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请 与我联系

以下是广告时间

推荐关注 Edi.Wang 的公众号