![](/img/trans.png)
[英]is there a way to pass unknown amount of types to generic method in C#?
[英]In C#, is there a generic way to pass a DBSet to a method?
我目前有以下工作代码:
private Converter RemoveAll<T>(List<T> databaseSet) {
databaseSet
.ForEach(item => this.myContext.Remove(item));
return this;
}
我可以像这样调用:
this.RemoveAll(this.myContext.Widgets.ToList());
this.RemoveAll(this.myContext.WhositsWhatsits.ToList());
// etc.
this.myContext
是MyContext
的一个实例,它扩展DbContext
; 和Widgets
、 WhositsWhatsits
等都是DbSet
的实例。
因为我总是需要将DbSet
更改为List
,所以我宁愿将DbSet
作为参数传递,例如:
this.RemoveAll(this.myContext.Widgets);
this.RemoveAll(this.myContext.WhositsWhatsits);
// etc.
但是,如果我将方法更改为:
private Converter RemoveAll<T>(DbSet<T> databaseSet) {
databaseSet.ToList()
.ForEach(item => this.myContext.Remove(item));
return this;
}
编译器抱怨“类型'T'必须是引用类型才能将其用作泛型类型或方法'DbSet'中的参数'TEntity'。
是否可以修改此方法,以便在调用 ToList() 之前无需调用它?
DbSet 仅限于将引用类型作为泛型参数。 因此,您需要限制您的方法也仅适用于引用类型。 它可以通过使用下面的where
子句来实现。
private Converter RemoveAll<TEntity>(DbSet<TEntity> databaseSet) where TEntity : class
代替使用 remove 方法,使用 removerange 可以避免调用 ToList()。 我提供了一种扩展方法,可以进一步减少代码。
public static class DbContextExtension
{
public static void RemoveAll<Tinput>(this DbSet<Tinput> dbset) where Tinput : class
{
dbset.RemoveRange(dbset);
}
}
用法会像。
this.myContext.Widgets.RemoveAll();
如果您不需要扩展方法,只需使用
dbset.RemoveRange(dbset);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.