如何返回T型?

时间:2016-06-29 07:50:35

标签: c# generics

我有通用方法:

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将在一个地方使用:为我的插件获取基础设施)我希望这是正常的。

4 个答案:

答案 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}} ..