C# 泛型问题 - 在构造函数中使用参数更新泛型类型

标签 c# generics

我正在尝试创建一个泛型类,它新建了一个泛型类型的实例。如下:

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/

相关文章:

c# - 获取所有使用特定泛型类实现类的类

javascript - 如何在 ASP.NET MVC 5 中动态从数据库中检索 Javascript 代码的数据?

c# - ChangePropertyAction 不影响 FontWeight

c# - 如何设置连接字符串,我只更改一个地方?

c# - 'SelectedIndex' 和 'SelectedValue' 属性是互斥的

c# - 将 StreamReader(String) 转换为与 UWP API 兼容?

c# - 查询 Entity Framework 以获取动态类型列表

java - 可比较无法转换为 T#1

java - 在 Java 中将 int[] 转换为 List<Integer> 的最佳方法?

java - 堆栈跟踪中的神秘行