刚刚尝试使用扩展方法,我正在开发一些映射逻辑,将应用程序Invoice转换为Quickbooks Invoice。认为拥有.Convert()扩展方法可能是个好主意。
public static QBInvoice Convert(this InvoiceHeader importedInvoice)
转换只是一个类到另一个类的字段映射。但后来我在某处读到一个扩展方法是扩展原始类,而不是将其转换为另一个类。因此我要问的原因。我在技术上知道我能做到,但这是最佳实践合规还是禁忌?
答案 0 :(得分:5)
我个人喜欢使用显式强制转换:
public class InvoiceHeader
{
public static explicit operator QBInvoice(InvoiceHeader invoice)
{
return new QBInvoice {}; // do your mapping
}
}
然后你可以施展它:
var qbInvoice = (QBInvoice) invoiceHeader;
答案 1 :(得分:2)
我们一直使用它来映射类...可能不是最好的解决方案,但至少你可以在远处隐藏无聊的代码,并使重要的代码(你的业务逻辑)变得美观和可读。
我必须强烈不同意上面的Blogbeard评论:类之间的映射与类本身(SRP)无关,因此将该代码放在两个类之外是更清晰的解决方案。
答案 2 :(得分:2)
一种广为接受的类转换方法,定义为扩展方法是ToArray()
。 AsEnumerable
,ToList
和ToDictionary
是其他广为接受的“转化”扩展方法。
“To”或“As”似乎是可接受的转换为另一种类型的扩展方法的命名约定,就像“On”是事件的标准命名约定的一部分一样。