gpt4 book ai didi

c# - 工厂根据通用类型创建对象 C#

转载 作者:太空狗 更新时间:2023-10-29 19:49:11 24 4
gpt4 key购买 nike

根据传递给工厂类的泛型类型实例化对象的最有效方法是什么,例如:

public class LoggerFactory
{
public static ILogger<T> Create<T>()
{
// Switch Statement?
// Generic Dictionary?
// EX.: if "T" is of type "string": return (ILogger<T>)new StringLogger();
}
}

你会怎么做?哪个分支语句?等等……

最佳答案

我认为最好保持简单,也许是这样的:

public static class LoggerFactory
{
static readonly Dictionary<Type, Type> loggers = new Dictionary<Type, Type>();

public static void AddLoggerProvider<T, TLogger>() where TLogger : ILogger<T>, new()
{
loggers.Add(typeof(T), typeof(TLogger));
}

public static ILogger<T> CreateLogger<T>()
{
//implement some error checking here
Type tLogger = loggers[typeof(T)];

ILogger<T> logger = (ILogger<T>) Activator.CreateInstance(tLogger);

return logger;
}
}

您只需调用 AddLoggerProvider对于您要支持的每种类型,都可以在运行时扩展,它确保您明确地将接口(interface)的实现添加到库中而不是某些对象,由于 Activator 不是很快,但创建记录器无论如何都不会成为瓶颈。希望它看起来没问题。

用法:

// initialize somewhere
LoggerFactory.AddLoggerProvider<String, StringLogger>();
LoggerFactory.AddLoggerProvider<Exception, ExceptionLogger>();
// etc..

ILogger<string> stringLogger = LoggerFactory.CreateLogger<string>();

注:每个ILogger<T> Activator 需要无参数构造函数,但是 new() 也确保了这一点添加方法中的通用约束。

关于c# - 工厂根据通用类型创建对象 C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1144835/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com