2012-10-29 53 views
2

我收到編譯時錯誤,我的方法調用有一些無效的參數。抽象類調用通用方法與此 - 不會編譯

public abstract class EntityBase 
{ 
    public virtual List<ValidationResult> Validate<T>() 
    { 
     // This line causes the error: 
     var validationResults = this.ValidateEntity<T>(this, true).ToList(); 
    } 

    protected IEnumerable<ValidationResult> ValidateEntity<T>(T entity, bool ignoreNullViolations) 
    { 
     // Code here 
    } 
} 

該課程是抽象的。這應該沒問題。我試圖在方法簽名中指定T的類型,但這並沒有幫助。爲什麼不能編譯?我無法將this傳遞給期望T參數的方法?

編輯 - 可能的解決方案:

public virtual List<ValidationResult> Validate<T>() where T : class 
{ 
    var validationResults = this.ValidateEntity<T>(this as T, true).ToList(); 
} 

EDIT 2

因爲T應該只是一個子類,我認爲類簽名應該改變是通用的,所以迫使子類設置它。然後通過this不會是這樣的黑客。

回答

5

您的ValidateEntity方法被聲明爲第一個參數的類型爲T

現在看你怎麼叫它:

var validationResults = this.ValidateEntity<T>(this, true).ToList(); 

你試圖隱式轉換thisT - 是什麼讓你認爲應該工作?

假設我打電話:

foo.Validate<string>(); 

這將試圖通過this的方法有效地期待string - 這顯然行不通的,因爲this是的EntityBase一些具體子類的實例的引用 - 不是對字符串的引用。

+0

嗯,我需要我的EntityBase類是EntityBase ? –

+0

我在我的帖子中添加了一個編輯,它顯示了一種讓它編譯的方法。這感覺就像一個黑客。但是你的回答回答了我的問題,所以我會接受它。謝謝! –

+0

@BobHorn:只有'this' * *實際上是'T'的一個實例才能使用'as'。不知道更多關於你想要達到的目標,很難知道最佳解決方案。 –