2013-10-14 69 views
1

我正在嘗試構建一個通用方法和實現IDetail的四個類。每個班級都有一個實施ITaxes的班級集合。我想建立一個通用的方法,讓我可以訪問每個類的集合。具有多個通用參數的C#方法

事情是這樣的:

public void UpdateCollection<T,I>(T Detail,Taxes TaxesList) where T:IDetail where I:Itaxes 
{ 
    foreach(Taxes tax in TaxesList) 
    { 
     Detail.I.Add(tax); 
    } 
} 

我要訪問TI類型的財產。我怎樣才能做到這一點?有可能的? 我是否需要爲每個班級編寫一種方法?

+2

您可以使用反射。 – SLaks

+1

你是什麼意思的「類型的財產」?可能有多個這樣的屬性,或者沒有......您可以使用反射來查找所有這些屬性,但這將是一個非常奇怪的方法IMO。 –

+2

'IDetail'是否實現'I'屬性? – Harrison

回答

4

理想情況下,您可以修改IDetail界面以包含ITaxes對象列表作爲該界面的一部分。如果您希望公開公開的命名屬性對每個細節都有不同的名稱,則可以使用顯式接口實現。

如果這是不可能的,或者由於其他原因沒有意義,那麼您最好的辦法可能是讓此方法接受此方法的Func<T, I>參數。然後,用戶可以提供一個方法,以允許用戶從各個T對象提取所需的列表:

public void UpdateCollection<T, I>(T Detail, Taxes TaxesList, Func<T, I> taxSelector) 
    where T : IDetail 
    where I : Itaxes 
{ 
    I taxList = taxSelector(Detail); 
    foreach (Taxes tax in TaxesList) 
    { 
     taxList.Add(tax); 
    } 
} 

呼叫者比可以使用lambda來定義該對象的相應屬性。

+0

我對''Func''沒有太多的經驗,請你給我一些關於使用''Func taxSelector''的信息來幫助你。 –

+0

這是一個代表。它表示一個函數,它接受一個類型爲「T」的單個參數並返回一個類型爲「I」的對象。 – Servy

+0

@Srvy,非常非常好,謝謝你的幫助 –

0

創建第三個界面,顯示您尋求的共同點。在部分類(如果生成)中訂閱接口,然後在泛型方法中只接受該接口並進行相應處理。