通过泛型方法传递类型的新实例

时间:2018-11-28 15:33:11

标签: c# generics reflection types

我有一系列非常相似的方法:

    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。

所以我立即想到了使用通用方法来减少代码重复...我似乎无法弄清楚哪种方法是“最佳实践”,而无需使用反射就可以得到所需的东西吗?

我根本没有使用过通用方法,因此欢迎您提出任何建议。

2 个答案:

答案 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;
}

当然,您可以定义接口中所有类通用的一些属性和方法。