Tôi đang cố gắng để tạo ra một lớp chung chung mới lên một thể hiện của loại chung chung. Như sau:C# vấn đề generics - làm mới lên các loại chung với các tham số trong constructor
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;
}
}
Nhưng tôi nhận được lỗi sau:
cannot provide arguments when creating an instance of a variable type
Tôi tìm thấy câu hỏi có liên quan sau đó là rất gần với những gì tôi cần: Passing arguments to C# generic new() of templated type
Tuy nhiên, tôi có thể' Tôi đã sử dụng câu trả lời được đề xuất của Jared vì tôi là gọi phương thức trong lớp Chung, không nằm ngoài số , vì vậy tôi không thể chỉ định lớp cụ thể.
Có cách nào khác không?
Tôi đã thử những điều sau dựa trên câu hỏi khác, nhưng nó không hoạt động vì tôi không biết loại bê tông T là chỉ định. Vì nó được gọi từ bên trong lớp chung chung, không bên ngoài:
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;
}
}
******** EDIT: THÊM GIẢI PHÁP CÓ THỂ **
Vì vậy, tôi đã thử nghiệm 2 giải pháp khả thi:
Đầu tiên chính xác như được giải thích dưới đây bởi Jon Skeet. Điều này chắc chắn hoạt động nhưng có nghĩa là có một lambda mơ hồ trong các nhà xây dựng . Tôi không phải là rất thoải mái với điều này vì nó có nghĩa là người dùng cần phải biết lambda chính xác đó là dự kiến. Sau khi tất cả, họ có thể vượt qua một lambda mà không mới lên các loại , nhưng làm một cái gì đó hoàn toàn bất ngờ
Thứ hai, tôi đã đi xuống tuyến đường phương pháp Nhà máy; Tôi đã thêm một Tạo phương pháp để giao diện chung:
IJewellerHomepageCarouselItem Create(PageData pageData);
Sau đó cung cấp một thực hiện trong mỗi lớp bê tông:
public IJewellerHomepageCarouselItem Create(PageData pageData)
{
return new JewellerHomepageCarouselItem(pageData, null);
}
Và sử dụng một hai bước khởi cú pháp:
T carouselItem = new T();
T homepageMgmtCarouselItem = (T) carouselItem.Create(jewellerPage);
Would thích nghe một số phản hồi về công đức của mỗi phương pháp này.
bản sao có thể có của [Gửi đối số cho C# generic mới() của loại templated] (http://stackoverflow.com/questions/840261/passing – nawfal