C#需要解释新约束(new T(...))

时间:2016-04-17 03:20:54

标签: c# class generics constraints new-operator

以下代码返回错误:

private void HandleBookLogic<T>() where T : Book , new()
{
    LibraryList.Items.Add(new MyItems(new T(int.Parse(copyNumber.Text), 
                                        itemName.Text, 
                                        DateTime.Parse(TimePrinted.Text), 
                                        int.Parse(Guid.Text), 
                                        (JournalCategory)Enum.Parse(typeof(JournalCategory), 
                                        Category.Text))));
}
  

'T'在创建Variable实例时无法提供参数   键入

我有3个通用用法类:reading\cooking\science

MyItems是负责绑定ListView的XAML的类(现在无关紧要)。 3个类中的每一个都给我一个错误:

  

'Reading'必须是具有public parameterless的非抽象类型   构造函数,以便在泛型类型中使用它作为参数'T'   方法'ItemWindow.HandleBookLogic()

我对C#很新鲜,我有点“理解”错误,但不知道如何处理它们。

感谢帮助。

编辑:额外代码:

private void Add_Click(object sender, RoutedEventArgs e)
{

    if (Type.Text == "Journal")
    {
        HandleJournalLogic();
    }
    else
    {
        if (Type.Text == "Reading")
            HandleBookLogic<Reading>();
        else if (Type.Text == "Cooking")
            HandleBookLogic<Cooking>();
        else
        {
            HandleBookLogic<Science>();
        }
    }
    InitFields();
}

有人可以修复我的代码,以便我可以了解它吗?

1 个答案:

答案 0 :(得分:3)

new约束仅适用于无参数构造函数。如果需要一个带参数的构造函数,那么调用者需要告诉你如何构造实例。一种常见的方法是让您的方法将工厂委托作为参数。

例如,您可以为Func<int, T>获取int的构造函数;调用者可以使用lambda来提供函数。

如果你知道确切的构造函数签名,你也可以使用反射,或者dynamic。但是,这些选项都比传递委托要快得多。根据您的需要,这可能不是问题。