当我尝试使用以下代码更新表时,我收到错误消息
“无法创建变量类型'T'的实例,因为它没有new()约束”
如何创建新实例并更新数据库中的数据。
IEnumerable<BookData> bookData = GetBookData(...);
BookDataContext bookDB = new BookDataContext ();
bookDB.UpdateTable<MCDB.BookTable>(bookDB.BookTable,bookData);
class BookTable
{
public string bookName { get; set; }
public string authorName { get; set; }
}
public static void UpdateTable<T>(this DataContext context, Table<T> tbl, IEnumerable<BookData> data)
where T : class
{
foreach (var item in data)
{
context.GetTable<T>().InsertOnSubmit(new T());
// Error in above statement
// I want to do something like this
context.GetTable<T>().InsertOnSubmit(new T
{
bName = item.bookName
aName = item.authorName,
});
}
context.SubmitChanges();
}
PS:我知道另一种方式,但我想使用扩展方法
更新表using ( BookDataContext bookDB = new BookDataContext ())
{
//code
}
由于
答案 0 :(得分:3)
您是否尝试过添加new constraint?
where T : class, new()
答案 1 :(得分:3)
public static void UpdateTable<T>(
this DataContext context, Table<T> tbl,
IEnumerable<BookData> data
) where T : class, new() {
// details
}
请注意,T
不能是抽象的,new
约束必须是列出的最后一个约束。
哇,刚才注意到了这一点:
context.GetTable<T>().InsertOnSubmit(new T
{
bName = item.bookName
aName = item.authorName,
}
);
除非您向T
添加约束,否则您无法逃避这一点,以便编译器知道T
具有名为bName
和aName
的属性。至少您需要指定
where T : BookData, new()
其中BookData
是一个定义了这些属性的类。这将指定T
为BookData
或派生自BookData
,并且它具有公共无参数构造函数。在这种情况下,您可以取消约束where T : class
。或者,您可以指定
where T : IBookData, new()
其中IBookData
是定义您正在使用的两个属性的接口。此约束指定T
是实现IBookData
的类型,并且它具有公共无参数构造函数。
鉴于此,我不明白为什么你这样做。