我有一系列非常相似的方法:
private static DocumentBody GetPdfBodyObject(int sectionId)
{
DocumentBody db = new DocumentBody();
// Add some stuff to Db
return db;
}
private static DocumentHeader GetPdfHeaderObject(int sectionId)
{
DocumentHeader dh = new DocumentHeader();
// Add some stuff to DH - similar to above
return dh;
}
依此类推...
如您所见,这两个示例之间的区别是基于实例化并返回的Type。
所以我立即想到了使用通用方法来减少代码重复...我似乎无法弄清楚哪种方法是“最佳实践”,而无需使用反射就可以得到所需的东西吗?
我根本没有使用过通用方法,因此欢迎您提出任何建议。
答案 0 :(得分:4)
这里的最佳实践是将静态方法重构为工厂方法,或者使用builder pattern(如果它是您要构建的较大对象)(看起来确实如此)。泛型方法的使用仅限于无参数的构造函数-每当构造函数采用参数时,您都需要使用Activator,这是一种反射,并且通常不需要此类代码。话虽如此:您使用无参数构造函数为构造对象提供了两种方法,因此您可以将两者重构为:
private static TT GetPdfObjectPart<TT>(int sectionId) where TT : class, new()
{
TT dh = new TT();
// Add some stuff to DH - similar to above
return dh;
}
还要注意,正如@dymanoid指出的那样-在这种情况下,您只能使用合同的一部分( where 子句)-因此您需要实现 所有构造类型的一些“通用”接口-您将只能使用该接口中的方法。看起来您确实处于经典情况下,使用构建器模式。
答案 1 :(得分:3)
对于我来说,界面很好:
private interface IDocumentPart
{
}
private class DocumentHeader : IDocumentPart
{
}
private class DocumentBody : IDocumentPart
{
}
private static T GetPdfPart<T>(int sectionId) where T : IDocumentPart, new()
{
var doc = new T();
return doc;
}
当然,您可以定义接口中所有类通用的一些属性和方法。