簡體   English   中英

如何檢查C#中的類是否為只讀?

[英]How do I check if a class is readonly in c#?

我可以編寫一個單元測試來確保我編寫的一個只讀類(一個沒有setter的類)在將來保持只讀狀態嗎? 我不希望任何人在我的課程中添加setter屬性。

基本上,我如何檢查C#中是否沒有設置器?

注意:問問者最初提出了一個問題:“如何確定類是否為值類型?” 然后更改它。

bool isValueType = object.GetType().IsValueType

要么

bool isValueType = typeof(YourClass).IsValueType

MSDN: http : //msdn.microsoft.com/zh-CN/library/system.type.isvaluetype.aspx

這應該為零:

var setterCount =  
    (from s in typeof(IDataCollector).GetProperties(
        BindingFlags.Public | BindingFlags.Instance)
    where s.CanWrite == true
    select s)
    .Count();

我認為這里的關鍵詞是“ 我不想讓任何人在我的課程中添加setter屬性。

通常,如果要編寫一個不可變的類,則應將您的類標記為已密封,並將所有字段標記為readonly


當然,如果您希望人們從您的班級繼承下來,則必須考慮以下幾點:

  • 沒有什么可以阻止一個人繼承將他們想要的任何屬性添加到您的類中的。 除約定外,您不能對繼承者強制執行該約束。

  • 可以使用反射進行運行時檢查,以查看繼承者是否添加了任何字段,但是我不建議這樣做,因為它違反了封裝的一些基本原理。

  • 您不僅需要檢查課程中的二傳手,還需要檢查更多。 一個人完全有可能編寫諸如setSomething (一種Java風格的setter)之類的方法,或者編寫具有使內部值發生變化的副作用的方法。 沒有有效的方法來檢查您的繼承者是否沒有使用類似的技巧來欺騙您的類中的可變性。

如果您允許人們繼承您的課程,那么實際上您無能為力,只能讓您的課程保持只讀狀態。

    Type type = typeof(YourClass);
    PropertyInfo[] properties = type.GetProperties(BindingFlags.Instance);
    bool passesTest = true;
    foreach (PropertyInfo property in properties)
    {
        passesTest = passesTest && property.CanWrite;
    }

僅將所有字段標記為只讀怎么樣?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM