【发布时间】:2016-03-10 00:40:37
【问题描述】:
我有两个模型都可以使用下面的功能。我创建了一个接口,这两个模型都实现了。
在下面的函数中,我遍历传入的列表并使用其中的值来创建列表的新版本。
public static IList<T> GenericFunction<T>(IList<T> objList) where T : IProduct
{
// In this function I am doing the following:
IList<T> retVal = new List<T>();
foreach (T obj in objList)
{
T newObj = (T)Activator.CreateInstance(typeof(T));
newObj.Price = obj.BasePrice + obj.OldPrice;
newObj.Description = obj.Name + " " + obj.Description;
retVal.add(newObj);
}
return retVal;
}
上面的代码可以运行,但我有几个问题:
为了使上述功能适用于任何实现 IProduct 的模型,我所做的就是我唯一的选择,对吗?起初我想我可以简单地创建一个标准函数,将IList<IProduct> 作为参数并返回IList<IProduct>。但后来我遇到了实例化一个新对象的问题,这导致我创建了一个通用函数。
另外,我可以在 newObj 上使用对象初始化器来设置它的属性吗?
看到这个StackOverflow post 后,我觉得我应该做一些不同的事情。
【问题讨论】:
-
真的吗?你可以创建一个接口的实例吗?
Activator.CreateInstance(typeof(obj))对我来说更有意义... -
他不是在做一个从接口派生的类型的实例吗?
-
为什么不添加
new约束并写T newObj=new T();?
标签: c# object generics generic-programming