如何为 System.Data.Linq.Table<T> 编写扩展方法?

4

我想为一些临时测试/控制台应用编写一个小而琐碎的扩展方法,但我一直无法弄清楚如何正确获取方法签名。我希望将它添加到所有的 System.Data.Linq.Table 中,并将类型T的实例作为参数传递。

这是我目前的代码,但无法通过编译:

public static void InsertAndSubmit<T>(this System.Data.Linq.Table<T> tbl, T element)
{
    tbl.InsertOnSubmit(element);
    tbl.Context.SubmitChanges();
}

类型“T”必须是引用类型,才能将其用作泛型类型或方法“System.Data.Linq.Table”的参数“TEntity”。
2个回答

6

试试这个:

public static void InsertAndSubmit<T>(this System.Data.Linq.Table<T> tbl, T element)
    where T : class
{
    tbl.InsertOnSubmit(element);
    tbl.Context.SubmitChanges();
}

为了使这个工作起来,你需要约束T的类型为引用类型(class)。

如果你查看Table<TEntity>文档,你会注意到TEntity也有同样的class类型约束。因此,你的T必须符合相同的约束才能与TEntity兼容。


所以我必须在我的扩展方法中指定这个原因是因为他们在定义中指定了吗?谢谢! - Allen Rice
是的。编译器发现你的 T 是无约束的,因此与在 TEntity 上指定的约束不兼容。因此,你必须约束你的类型,以使编译器确信你的类型与 TEntity 确实兼容。 - Joshua Rodgers
太棒了,说得很有道理。我从来没想过要查找Linq.Table的定义,这让我快要疯了。我从未意识到约束条件会延续到扩展方法中。非常感谢!等系统允许时我会接受的。 - Allen Rice

3

您需要指定在您的T中只使用引用类型。请尝试:

public static void InsertAndSubmit<T>(this System.Data.Linq.Table<T> tbl, T element) 
    where T : class
{
    tbl.InsertOnSubmit(element);
    tbl.Context.SubmitChanges();
}

啊,谢谢,我相当确定我的方法签名是正确的。我没想到需要指定T的类型。 - Allen Rice

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接