我有通用方法:
private ILogger _logger; //get logger something else.
public T GetService<T>(ServiceType type)
{
//how to return _logger?
}
我怎么能回T? 例如,我有ILogger:
var logger=GetService<ILogger>(log);
如何实现GetService方法? 谢谢!
P.S。是的,我尝试从GetService方法中获取一个或多个类型。 例如:Logger,一些其他基础结构类。 我知道,ServiceLocator不是正确的选择(它在许多地方使用),但以我的方式(GetService将在一个地方使用:为我的插件获取基础设施)我希望这是正常的。
答案 0 :(得分:2)
听起来您正在尝试根据类型创建某种工厂方法。也许这可能会有所帮助:
public class Factory
{
private ILogger _logger; //get logger something else.
public Factory()
{
_factories = new Dictionary<Type, Func<Type, object>>()
{
{ typeof(ILogger), t => _logger },
};
}
private Dictionary<Type, Func<Type, object>> _factories;
public T GetService<T>()
{
var t = typeof(T);
return (T)_factories[t].Invoke(t);
}
}
答案 1 :(得分:1)
我会开始确保T
实现ILogger
。然后你必须将实例强制转换为T
:
public T GetService<T>(ServiceType type) where T : ILogger
{
return (T)_logger;
}
请注意,这可能会导致无效的强制转换。要防止此异常并返回null,您可以使用as
:
public T GetService<T>(ServiceType type) where T : ILogger
{
return _logger as T;
}
答案 2 :(得分:1)
试试这个:
private ILogger _logger; //get logger something else.
public T GetService<T>(ServiceType type)
{
// codes here...
return (T)(object) _logger;
}
答案 3 :(得分:-4)
您必须将T
声明为new()
,因此它必须具有无参数构造函数。然后你可以简单地创建一个实例并将其返回:
public T GetService<T>(ServiceType type) where T : new()
{
T t = new T();
return t;
}
现在,您可以使用其他new T()
而不是ServiceType
,而不是{{1}} ..