通过Generic方法传递Type的新实例

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了通过Generic方法传递Type的新实例相关的知识,希望对你有一定的参考价值。

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

    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。

所以我立刻想到使用通用方法来减少代码重复......我似乎无法弄清楚哪种方式是“最佳实践”,我可以在不使用反射的情况下得到我需要的东西吗?

我没有使用过通用方法,所以欢迎任何建议。

答案

至于我,界面很好:

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

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

另一答案

这里的最佳实践是将静态方法重构为工厂方法,或者使用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子句) - 所以你需要为所有构造的类型实现一些'通用'接口 - 而你' d仅限于界面中的方法。看起来你在经典情况下使用构建器模式。

以上是关于通过Generic方法传递Type的新实例的主要内容,如果未能解决你的问题,请参考以下文章

使用包含 Type 的变量创建 Generic<T> 类型实例

创建片段的新实例时菜单未膨胀

将接口从片段传递到kotlin中的活动

将实例化的 System.Type 作为通用方法的类型参数传递

操作栏选项卡:使用多次实例化的单个片段时如何传递参数

在片段中接收 NFC 的应用程序创建托管活动的新实例