Создайте класс с помощью Optional Generi c Type <T> - PullRequest
0 голосов
/ 12 марта 2020

Допустим, у нас есть класс, который выглядит следующим образом:

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

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

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

В случае выше, Type должен быть объявлен вместе с классом, но вы не нужно указать тип при вызове SomeMethod().

. Или вы также можете сделать это:

public class Repository
{    
    private readonly string _connectionString;

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

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

В этом случае класс будет создан без типа, но вы потребовалось бы объявить тип при вызове SomeMethod().

Без полного дублирования всего кода, как создать один и тот же класс, чтобы тип был необязательным при его создании? Другими словами, я бы хотел, чтобы оба этих параметра работали в восходящем направлении:

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

и

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

1 Ответ

4 голосов
/ 12 марта 2020

Если это то, чего вы хотите достичь, вы можете минимизировать дублирование, заключив в метод generi c реализацию :

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>();
}

Где generi c класс просто переходит через обобщенные методы c.

EDIT

Та же концепция, что и выше, передача введенного 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>();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...