2016-06-28 22 views
2

聲明我有以下的推導:檢查一類的屬性或方法作爲密封

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); 
+0

屬性不能密封。類可以。 –

+0

'bool isSealed =!property.GetMethod.IsVirtual;' –

+1

在C#方法默認情況下是「密封的」(不能被重寫)。你必須將它們明確地標記爲「虛擬」,這就是爲什麼檢查虛擬方法比「密封」方法更有意義。 –

回答

4

這聽起來像你想斷定方法不能被重寫。在這種情況下,你想要的IsFinalIsVirtual屬性的組合:

PropertyInfo property = typeof(Myclass).GetProperty("myProperty") 

Assert.IsTrue(property.GetMethod.IsFinal || !property.GetMethod.IsVirtual); 

從MSDN的一些注意事項:

要確定的方法是重寫的,這是不夠的檢查IsVirtual是真正。對於可覆蓋的方法,IsVirtual必須爲true並且IsFinal必須爲false。例如,一個方法可能是非虛擬的,但它實現了一個接口方法。公共語言運行庫要求所有實現接口成員的方法都必須標記爲虛擬;因此,編譯器將該方法標記爲虛擬最終。所以有些情況下一個方法被標記爲虛擬的,但仍然不可覆蓋。