我正在尝试创建一个处理我的两个模型之一的通用函数。请注意,这两个模型都具有相同的确切属性......
例如,在下面的代码中,即使两个&#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));
}
答案 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
具有Name
和Price
属性。
注意:您可以只输入参数列表和返回类型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)
您应该研究抽象类,扩展和多态。使用价格变量创建一个抽象类,然后从中扩展您的两个类。然后使用抽象类作为参数。