2016-09-23 42 views
0

我有一個方法傳遞一個對象作爲一個通用的。請注意,這些對象不是從同一個類派生的。我有一個函數,我想打電話不管類型,但無法調用,因爲它不能確定類型。通用對象調用方法

'T' does not contain a definition for 'Validate' 

和代碼

public void VerifyInput<T>(T obj) 
{ 
    ((T)obj).Validate(); 
} 

這被用來驗證傳入的用戶數據,每一類都是負責制定自己的驗證,但他們不一定任何關係。 我簡化了這個,但基本問題依然存在。我怎樣才能轉換泛型的類型來調用對象方法?

+0

除非您的類從包含'Validate'方法的相同基類派生,或者使用此方法實現接口,否則不能這樣做。然後你可以將T泛型參數約束到這個基類或接口。 –

+0

在C#中這是不可能的,除非你用方法'Validate'指定一個接口,然後檢查泛型類型,比如「where T:IValidate',其中'IValidate'是方法的接口。 – Bauss

+0

謝謝,我要補充說我知道一般的約束條件,但是希望我可以在沒有它的情況下執行此操作,我很感謝這個更新 – McArthey

回答

2

請注意,這些對象不會從同一個類派生。我有一個函數,我想打電話不管類型,但無法調用,因爲它不能確定類型。

這是您應該使用接口的地方。

public interface IValidatable { 
    void Validate(); 
} 

並在您的方法

public void VerifyInput<T>(T obj) where T : IValidatable 
{ 
    obj.Validate(); 
} 

這樣做將確保在傳遞類型一致的界面合同,但不是限制到特定類型的定義。

2

使用Validate()方法創建一個接口IValidatable,然後在每個類中實現它,並更改VerifyInput的輸入以接受該接口並刪除泛型類型。

public void VerifyInput(IValidatable obj) 
{ 
    obj.Validate(); 
} 

事實上,如果你這樣做,你可能會完全擺脫VerifyInput,只需調用目標對象的驗證。