上下文中的泛型

时间:2016-12-04 20:06:15

标签: c# generics

我开始写这个作为一个真实的问题,但我一直在想着答案,我想我会发布它,看看是否还有其他解决方案

我可以想到两个例子,其中泛型成为一种不必要的痛苦,我想知道是否有解决方案。

示例1

public class SomeClass<TDbConnection, TDbTransaction>
{
}

现在对于我们任何人来说显而易见--DbTransaction和DbConnection实现将始终成对使用 - 无论是SqlConnection还是SqlTransaction还是OracleConnection和{{ 1}}

除了没有办法确保类型有意义的事实(当OracleTransaction使用三个或四个参数时,没有什么能阻止我创建SomeClass<SqlConnection, OracleTransaction>,这些参数可以通过上下文*来推断,实例化每种类型都会浪费不必要的时间。

*在这个例子中,我不确定框架是如何知道的,但你明白我的观点?无论如何,下一个例子更相关

示例2

SomeClass

在这个示例中,我设法强制在实例化中使用正确的public interface IPoco<TKey> { public TKey Id { get; set; } } public class SomePOCO : IPoco<int> { public int Id { get; set; } } public class SomeClassUsingPOCOAndId<TPoco, TKey> where TPoco : IPoco<TKey> { } ,但为什么我只能调用TKeynew SomeClass<IPoco<int>>()我的意思是{{1是可推断的。

可能的解决方案

我可以删除泛型,在某些情况下它是有意义的(就像第一个例子)。在其他方面,并没有那么多,并创建内存或运行时开销(不必要地创建字段或转换)或不必要的代码重复。

我想到的另一个解决方案是创建类似这样的东西

new SomeClass<SomePoco>()

这允许我减少实例化所需的代码量 - 但是根据我对pocos的使用 - 为每种类型创建上下文可能会非常耗时。

现在我想知道 - 是不是有办法简化这个过程?也许是某种合成糖?在C#7或8上实现它需要什么?

0 个答案:

没有答案