繁体   English   中英

创建一个具有可选泛型类型的类<T>

[英]Create a class with Optional Generic Type <T>

假设我们有一个看起来像这样的类:

public class Repository<T>
{
    private readonly string _connectionString;

    public Repository(string connectionString)
    {
        _connectionString = connectionString;
    }

    void T SomeMethod()
    {
       // do work here
       return T;
    }
}

在上述情况下,该类型需要与类一起被声明,但你不会需要时调用指定类型SomeMethod()

或者,您也可以这样做:

public class Repository
{    
    private readonly string _connectionString;

    public Repository(string connectionString)
    {
        _connectionString = connectionString;
    }

    void T SomeMethod<T>()
    {
       // do work here
       return T;
    }
}

在这种情况下,类将没有类型来创建的,但你需要打电话时申报类型SomeMethod()

如果没有所有代码的完全重复,如何创建相同的类,以便在创建它时 Type 是可选的? 换句话说,我希望这两个都在上游工作:

Repository<MyType> repo = new Repository<MyType>();
var something = repo.SomeMethod();

Repository repo = new Repository();
var something = repo.SomeMethod<MyType>();

如果这是您想要实现的目标,您可以通过包装泛型方法实现来最大程度地减少重复:

public class Repository
{
    public T SomeMethod<T>()
    {
        //Impl.
    }
}

public class Repository<T>
{
    private readonly Repository _base;

    public Repository()
    {
        _base = new Repository();
    }

    public T SomeMethod() => _base.SomeMethod<T>();
}

泛型类只是代理泛型方法。

编辑

与上面相同的概念,将注入的connectionString传递给包装的实例。

public class Repository
{
    private readonly string _connectionString;

    public Repository(string connectionString)
    {
        _connectionString = connectionString;
    }

    public T SomeMethod<T>()
    {
        //Impl.
    }
}

public class Repository<T>
{
    private readonly Repository _base;

    public Repository(string connectionString)
    {
        _base = new Repository(connectionString);
    }

    public T SomeMethod() => _base.SomeMethod<T>();
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM