以下代码返回错误:
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();
}
有人可以修复我的代码,以便我可以了解它吗?
答案 0 :(得分:3)
new
约束仅适用于无参数构造函数。如果需要一个带参数的构造函数,那么调用者需要告诉你如何构造实例。一种常见的方法是让您的方法将工厂委托作为参数。
例如,您可以为Func<int, T>
获取int
的构造函数;调用者可以使用lambda来提供函数。
如果你知道确切的构造函数签名,你也可以使用反射,或者dynamic
。但是,这些选项都比传递委托要快得多。根据您的需要,这可能不是问题。