2015-04-19 61 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)来完成,我不完全明白,但它肯定会在这里工作。 –

相关问题