2015-04-19 91 views
0

我有一個函數列表<>設置爲參數,它看起來是這樣的:如何用同樣的方法對不同類作爲參數

private Double CalculateConsumption(List<GasConsumRecord> gasRecord) 
{ 
    ... 
    foreach (var record in gasRecords){ 
    var x = record.Counter; 
    var y = record.Pressure; 
    ... 
    } 
    ... 
} 

GasConsumRecord類有更多的性能,但此功能我只使用2.

而且我有另一個類 - AirConsumRecord它具有相同的2個屬性,但其他屬性不同。兩個類都只有屬性,但沒有方法。

我的問題是:如何用同樣的方法對兩種不同類List <>作爲參數?

在此先感謝。

+0

您可以嘗試使用類似於C++中的模板的泛型方法:https://msdn.microsoft.com/en-us/library/twcad0zb.aspx –

回答

6

你需要你的類實現相同的接口,或者從同一個基類,它包含這兩個屬性獲得,然後用一個類型約束的一般方法:

如果您使用的接口:

public interface IRecord { 
    int Counter { get; set; } 
    int Pressure { get; set; } 
} 

public class GasConsumRecord : IRecord { 
    public int Counter { get; set; } 
    public int Pressure { get; set; } 
} 

public class AirConsumRecord : IRecord { 
    public int Counter { get; set; } 
    public int Pressure { get; set; } 
} 

private Double CalculateConsumption<T>(List<T> records) 
    where T : IRecord 
{ 
    foreach (IRecord record in records){ 
     var x = record.Counter; 
     var y = record.Pressure; 
    } 
} 
+1

記錄參數可以直接爲類型List

+0

@GiorgiNakeuri:只有當原始對象實際上屬於'List '。否則,就像Joe在這裏展示的那樣,它必須作爲一個約束泛型來完成。如果你能在實際上通過列表''的一個實例給需要'名單'實例的方法,那麼該方法可以AirConsumRecord'的'的元素添加到列表中。顯然這不會/不應該工作。 –

+0

@GiorgiNakeuri確實提出了一個很好的觀點,如果這些接口對於實現的目的來說足夠好,那麼您可以使參數'IList '或'IEnumerable '而不是'List '。有很多事情可以用[協方差和反變量](https://msdn.microsoft.com/en-us/library/ee207183.aspx)來完成,我不完全明白,但它肯定會在這裏工作。 –

相關問題