2015-10-16 29 views
0

我試圖寫一個通用的方法如何在c#中使用泛型,其中兩個不相關的類具有相同的屬性?

GenericMethod<T>(T item) where T : class 
{ 
    (if item.value1 == "something") 
     doSomething 
} 

但我得到一個錯誤:

T does not contain the definition of value1. 

我通過其他的答案中搜索的StackOverflow,並試圖實現一個接口,然後改變方法定義where T: dummyInterface

雖然這種去除方法的錯誤,我得到的錯誤,同時調用方法:

我需要從兩個不同的類調用方法:GenericMethod(customerRet)GenericMethod(vendorRet)

GenericMethod(customerRet)拋出一個編譯錯誤:

accountRet should be convertible to dummyInterface 

我也收到同樣的錯誤GenericMethod(vendorRet)

customerRetvendorRet沒有任何關係 - 沒有統一的接口等

+0

您是否需要在不同的課程中執行很多操作,或者這只是一次性操作? –

回答

1

你應用的約束是class。在運行時,您可以傳入任何類,其中可能包含或不包含名爲value1的屬性。您可以指定準備使用的確切類別,或者爲約束指定具有屬性value1的接口。

+0

我在兩個不同的調用中傳遞兩個單獨的類。所以通過確切的課程不是一種選擇。當我使用接口時,在調用方法時出現錯誤,正如我提到的 –

+0

,您打算使用此類方法的任何類型必須具有「value1」。你打算如何確保這一點?所以'customerRet'和'vendorRet'這兩個類應該實現這個包含'value1'的接口。 – singsuyash

1

要麼讓AccountRetVendorRet實施IDummyInterface,在這種情況下,您不再需要一個通用的方法:

PerformOperation(IDummyInterface item) 
{ 
    if (item.value1 == "something") 
     DoSomething(); 
} 

或者使該方法的兩個重載,如果你無法改變這兩個類的一些原因

PerformOperation(AccountRet item) 
{ 
    if (item.value1 == "something") 
     DoSomething(); 
} 

PerformOperation(VendorRet item) 
{ 
    if (item.value1 == "something") 
     DoSomething(); 
} 

你原來的代碼無法編譯,因爲編譯器不能在編譯時有一個屬性Value1證明對通用T類 - 事實上,這是而不是的情況下任何任意T當沒有約束。

相關問題