c# - 使用带有泛型的工厂类
问题描述
我有以下课程:
public class ThisClass<T>
{
public T ThisInstance { get; set; }
public int Infoflag { get; set; }
}
我想创建一个静态工厂方法,例如:
public static ThisClass GetNewClass<T>(T instance) =>
new ThisClass<T>()
{
Infoflag = 3
};
我遇到的问题是,因为实例类需要一个类型,我不得不像这样声明方法:
public static ThisClass<T> GetNewClass(T instance) =>
new ThisClass<T>()
{
Infoflag = 3
};
然后这样称呼它:
ThisClass<SomeClassType>.GetNewClass(instanceClass);
感觉有点麻烦;如果我只能在静态方法的方法上使用类型,那么我就可以使用推断类型,所以:
ThisClass.GetNewClass(instanceClass);
这可能吗,还是我需要将工厂和实例类分开?
解决方案
只需创建一个静态ThisClass
助手类并将静态工厂方法放在那里:
public static class ThisClass
{
public static ThisClass<T> Create<T>(T instance) =>
new ThisClass<T>()
{
Infoflag = 3
};
}
如果您不希望消费者创建ThisClass<T>
避免使用工厂方法的实例,那么您可以将其设为构造函数internal
以确保外部程序集始终必须调用Create<T>
. 您还可以使用其他更复杂的模式来解决此问题,例如创建ThisClass<T>
嵌套类型ThisClass
(不再static
) 并公开接口;大致如下:
public interface IThisClass<T> { ... }
public class ThisClass
{
private class InnerThisClass<T>: IThisClass<T> { ... }
public static IThisClass<T> Create<T>(T instance) => ...
}
如果没有更多数据,很难找出更适合您的模式。
推荐阅读
- python - Docker - Ubuntu 中的主管抛出 ENOEXEC 错误
- bash - 我可以在命令之间添加参数吗?
- angular - 如何在拖放 Angular Cdk 8.0.0 中删除项目
- javascript - 在初始化时全屏渲染谷歌地图
- reactjs - 使用 adalFetch 从 API 调用返回的“AADSTS500011”错误消息
- python - 通过 pyenv 安装的解释器不会添加到 $PATH
- angular - “无法解码下载的字体”错误,但字体正在工作 Angular 5
- sql - 有什么方法可以加快这个查询捕获客户信息的速度吗?有没有更好的方法来处理这些数据?
- azure - Azure Function V2 JWT - AD 身份验证
- python - 删除 Pandas Dataframe 列范围内的列,其中每列的总和小于 10