通过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> 类型实例