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

C#需要解释新约束(新T(…)),c#,class,generics,constraints,new-operator,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, Date

以下代码返回一个错误:

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))));
}

有人能修好我的代码让我了解它吗?

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

例如,您可以使用
Func
作为接受
int
的构造函数;调用方可以使用lambda提供函数


如果您知道确切的构造函数签名,还可以使用反射或
动态
。不过,这些选项都比传递代理慢得多。根据您的需要,这可能不是问题。

这是唯一的方法吗?我会用更多的代码更新我的帖子,这样你就可以指导我了。根据您的代码示例,我实际上认为最好的解决方案是使用普通子类型多态性来分派到不同的实现。也就是说:与其打开表示需要执行哪种“类型”操作的字符串,不如对不同的操作使用实际类型。因为我是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();
}