在c#中创建只适用于特定类型的泛型函数

时间:2016-03-08 22:36:18

标签: c# generics generic-collections

我正在尝试创建一个处理我的两个模型之一的通用函数。请注意,这两个模型都具有相同的确切属性......

例如,在下面的代码中,即使两个&#39; NewProduct&#39;和&#39; OldProduct&#39;有这个属性。如何向VS指定我希望能够传入的两种类型? IList<NewProduct>, IList<OldProduct>

public static IList<T> GenericFunction<T>(IList<T> objList)
{
    IList<T> filteredData = objList.Where(p => p.Price > 0));
}

5 个答案:

答案 0 :(得分:5)

两种类型都需要相同的接口或公共基类,在此处称为ProductBase。然后,您可以使用where关键字的通用约束:

public static IList<T> GenericFunction<T>(IList<T> objList) 
  where T : ProductBase
{
    IList<T> filteredData = objList.Where(p => p.Price > 0));
}

如果ProductBase定义了属性Price

,则此方法有效

答案 1 :(得分:2)

为了使其工作,您需要一个公共基类或在两种产品类型中实现的通用接口。

public interface IProduct
{
    string Name { get; set; }
    decimal Price { get; set; }
}

然后您可以添加generic type constraint

public static IList<P> GenericFunction<P>(IList<P> objList)
    where P : IProduct // Here you can specify either the base class or the interface.
{
    return objList
        .Where(p => p.Price > 0)
        .ToList();
}    

现在C#知道通用类型P具有NamePrice属性。

注意:您可以只输入参数列表和返回类型IList<IProduct>;但是,IList<OldProduct>IList<NewProduct> 分配与之兼容。

UPDATE:如果它具有默认构造函数(即具有空参数列表或根本没有显式构造函数声明的构造函数),则可以实例化泛型类型。然后,您需要将new()添加到泛型类型约束:

where P : IProduct, new()

然后您可以使用以下命令创建一个新对象:

P newObject = new P();

答案 2 :(得分:2)

您可以使用where generic constraint https://msdn.microsoft.com/en-us/library/bb384067.aspx

您需要一些扩展/实现的公共基类或接口。您可以定义多个约束,但它们必须相关。

interface IProduct
{
    double Price { get; }
}

public static IList<T> GenericFunction<T>(IList<T> objList) where T : IProduct
{
    IList<T> filteredData = objList.Where(p => p.Price > 0));
}

答案 3 :(得分:2)

你应该使用一个接口。使用您需要的属性创建一个界面:

public interface MyInterface
{
    string Name { get; set; }
    string Color { get; set; }
}

这些属性应该是您的模型共享的属性。然后在您的模型中,您必须实现接口:

public class MyModel : MyInterface

然后制作你的方法:

public void MyFunction(List<MyInterface> myModel)

答案 4 :(得分:1)

您应该研究抽象类,扩展和多态。使用价格变量创建一个抽象类,然后从中扩展您的两个类。然后使用抽象类作为参数。