我正在尝试创建一个泛型类,它新建了一个泛型类型的实例。如下:
public class HomepageCarousel<T> : List<T>
where T: IHomepageCarouselItem, new()
{
private List<T> GetInitialCarouselData()
{
List<T> carouselItems = new List<T>();
if (jewellerHomepages != null)
{
foreach (PageData pageData in jewellerHomepages)
{
T item = new T(pageData); // this line wont compile
carouselItems.Add(item);
}
}
return carouselItems;
}
}
但是我得到以下错误:
cannot provide arguments when creating an instance of a variable type
我发现以下相关问题非常接近我需要的问题: Passing arguments to C# generic new() of templated type
但是,我不能像现在这样使用 Jared 建议的答案 在泛型类中调用方法,而不是在类外 它,所以我无法指定具体类。
有解决办法吗?
我已经根据另一个问题尝试了以下,但是 它不起作用,因为我不知道 T 的具体类型 指定。因为它是从通用类内部调用的,所以不是 外面:
public class HomepageCarousel<T> : List<T>
where T: IHomepageCarouselItem, new()
{
private List<T> LoadCarouselItems()
{
if (IsCarouselConfigued)
{
return GetConfiguredCarouselData();
}
// ****** I don't know the concrete class for the following line,
// so how can it be instansiated correctly?
return GetInitialCarouselData(l => new T(l));
}
private List<T> GetInitialCarouselData(Func<PageData, T> del)
{
List<T> carouselItems = new List<T>();
if (jewellerHomepages != null)
{
foreach (PageData pageData in jewellerHomepages)
{
T item = del(pageData);
carouselItems.Add(item);
}
}
return carouselItems;
}
}
********编辑:添加了可能的解决方案**
所以我测试了 2 种可能的解决方案:
首先完全按照Jon Skeet 的解释.这个 绝对有效,但意味着在 构造函数。我对此不太满意,因为这意味着 用户需要知道预期的正确 lambda。 毕竟,他们可以传递一个不更新的 lambda 键入,但做了一些完全出乎意料的事情
其次,我走的是工厂方法路线; 我在公共(public)接口(interface)中添加了一个 Create 方法:
IJewellerHomepageCarouselItem Create(PageData pageData);
然后在每个Concrete类中提供一个实现:
public IJewellerHomepageCarouselItem Create(PageData pageData)
{
return new JewellerHomepageCarouselItem(pageData, null);
}
并使用两步初始化语法:
T carouselItem = new T();
T homepageMgmtCarouselItem = (T) carouselItem.Create(jewellerPage);
很想听听有关每种方法优点的一些反馈。
最佳答案
您是否考虑过使用 Activator(这只是另一种选择)。
T homepageMgmtCarouselItem = Activator.CreateInstance(typeof(T), pageData) as T;
关于C# 泛型问题 - 在构造函数中使用参数更新泛型类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1682310/