2016-05-13 36 views
3

我看到幾個abstract基類.NET提供,我完全失去了它們的構造函數和虛方法定義的方式。例如,看到System.ComponentModel.DataAnnotations.ValidationAttribute基類:抽象類中未實現的構造函數

public abstract class ValidationAttribute : Attribute 
{ 
    // Summary: 
    //  Initializes a new instance of the System.ComponentModel.DataAnnotations.ValidationAttribute 
    //  class. 
    protected ValidationAttribute(); 
    ... 
    protected virtual ValidationResult IsValid(object value, ValidationContext validationContext); 
} 

但我不能在我自己的類做到這一點:

public abstract class MyClass 
{ 
    protected MyClass();  
} 

MyClass.MyClass()必須聲明主體,因爲它不標記爲抽象,EXTERN或部分

我不能將其標記abstract之一:

的修改抽象不適用於這個項目

我無特殊需要MyClass要像ValidationAttribute或其他基類中.NET。我只是想知道他們是如何在運行時編譯的。

+2

你看到的是元數據,類的定義,而不是真正的實現。 –

+0

您如何獲得'ValidationAttribute'的源代碼,您是否使用過一些反編譯器?它看起來像方法體被刪除,這裏https://github.com/Microsoft/referencesource/blob/master/System.ComponentModel.DataAnnotations/DataAnnotations/ValidationAttribute.cs是它的更現實的版本。 – csharpfolk

+1

「ValidationAttribute」的代碼無效 - 如果您查看[_actual_ source](http://referencesource.microsoft.com/System.ComponentModel.DataAnnotations/R/bf57007a2f61c388.html),您會看到所有構造函數有一個body。我懷疑你正在查看元數據或一個糟糕的反編譯器結果,而不是實際的源代碼。 –

回答

6

您沒有查看ValidationAttribute的代碼,您正在查看其元數據。

actual constructor看起來像

protected ValidationAttribute() 
    : this(() => DataAnnotationsResources.ValidationAttribute_ValidationError) { 
}