是否有可能以更清洁的方式重申这些通用约束?

时间:2009-12-11 09:31:22

标签: .net generics c#-3.0

假设如下:

public class MyFunkyTable : DbObject
{
    // this class will be generated
}

public class MyFunkyDomainObject : DomainObject
{
    // this class will be custom-made
}

public class MyFunkyMapper : Mapper<MyFunkyTable, MyFunkyDomainObject>
{
    // this will be custom mapping code due to wired abstraction and ... "supercool" db-system
}

一般来说我们会做以下事情:

MappingHelper<MyFunkyTable, MyFunkyMapper, MyFunkyDomainObject>.GetSingle(...);

重复通用约束有点麻烦(MyFunkyMapper已经指定了泛型..)

有没有办法做类似的事情:

MappingHelper<MyFunkyMapper>.GetSingle(..);

修改
我已经提出了一个想法:使用扩展方法,但这不是我想要的......

2 个答案:

答案 0 :(得分:3)

你为什么不做一些像

这样的事情
var item = mappers.Get<MyFunkyMapper>().GetSingle(...);

这假定Mapper<TTable, TDomain>具有GetSingle<TDomain>(...)方法。如果是这种情况,类型推断将找出GetSingle的泛型参数,即使你没有写它。

顺便说一下,您是否考虑过使用AutoMapper进行映射而不是自己动手?

答案 1 :(得分:1)

我想你不能。编译器可以通过查看函数的参数来推断类型参数,但就是这样。由于您没有传递任何参数,因此您将无法使用类型推断。

我可能建议的一个快捷方式是“using”关键字使用较少的功能。只需在文件顶部添加(在正常使用的旁边)这一行:

using TheMapper = MappingHelper<MyFunkyTable, MyFunkyMapper, MyFunkyDomainObject>;

然后在代码中

TheMapper.GetSingle();

如果文件访问一个或几个映射器,这个简写可以派上用场。

另一个想法 - 而不是MappingHelper,为什么不在Mapper<T1, T2>类中添加所有这些内容?然后你就可以使用

MyFunkyMapper.GetSingle();