我开始写这个作为一个真实的问题,但我一直在想着答案,我想我会发布它,看看是否还有其他解决方案
我可以想到两个例子,其中泛型成为一种不必要的痛苦,我想知道是否有解决方案。
public class SomeClass<TDbConnection, TDbTransaction>
{
}
现在对于我们任何人来说显而易见--DbTransaction和DbConnection实现将始终成对使用 - 无论是SqlConnection
还是SqlTransaction
还是OracleConnection
和{{ 1}}
除了没有办法确保类型有意义的事实(当OracleTransaction
使用三个或四个参数时,没有什么能阻止我创建SomeClass<SqlConnection, OracleTransaction>
,这些参数可以通过上下文*来推断,实例化每种类型都会浪费不必要的时间。
*在这个例子中,我不确定框架是如何知道的,但你明白我的观点?无论如何,下一个例子更相关
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>
{
}
,但为什么我只能调用TKey
或new SomeClass<IPoco<int>>()
我的意思是{{1是可推断的。
我可以删除泛型,在某些情况下它是有意义的(就像第一个例子)。在其他方面,并没有那么多,并创建内存或运行时开销(不必要地创建字段或转换)或不必要的代码重复。
我想到的另一个解决方案是创建类似这样的东西
new SomeClass<SomePoco>()
这允许我减少实例化所需的代码量 - 但是根据我对pocos的使用 - 为每种类型创建上下文可能会非常耗时。
现在我想知道 - 是不是有办法简化这个过程?也许是某种合成糖?在C#7或8上实现它需要什么?