我有以下派生:
interface IMyInterface
{
string myProperty {get;}
}
class abstract MyBaseClass : IMyInterface // Base class is defining myProperty as abstract
{
public abstract string myProperty {get;}
}
class Myclass : MyBaseClass // Base class is defining myProperty as abstract
{
public sealed override string myProperty
{
get { return "value"; }
}
}
我希望能够检查类的成员是否被声明为密封。有点像这样:
PropertyInfo property = typeof(Myclass).GetProperty("myProperty")
bool isSealed = property.GetMethod.IsSealed; // IsSealed does not exist
感觉这一切都是为了能够运行测试,检查代码/项目的一致性。
以下测试失败:
PropertyInfo property = typeof(Myclass).GetProperty("myProperty")
Assert.IsFalse(property.GetMethod.IsVirtual);
听起来您想断言一个方法不能被重写。在这种情况下,您需要IsFinal
和IsVirtual
属性的组合:
PropertyInfo property = typeof(Myclass).GetProperty("myProperty")
Assert.IsTrue(property.GetMethod.IsFinal || !property.GetMethod.IsVirtual);
MSDN的一些注释:
要确定方法是否可重写,仅检查
IsVirtual
为真是不够的。对于可重写的方法,IsVirtual
必须为真,IsFinal
必须为假。例如,一个方法可能是非虚的,但它实现了一个接口方法。公共语言运行库要求所有实现接口成员的方法都必须标记为virtual;因此,编译器将该方法标记为virtual final。因此,在某些情况下,方法被标记为virtual,但仍然不可重写。