我在写一个有趣的 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://dotnet-campus.github.io//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 ,以避免陈旧错误知识的误导,同时有更好的阅读体验。
本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。欢迎转载、使用、重新发布,但务必保留文章署名 lindexi (包含链接: https://dotnet-campus.github.io/ ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请 与我联系 。