Есть ли способ передать аргумент в конструктор класса при использовании в качестве параметра типа? - PullRequest
0 голосов
/ 04 февраля 2019

Я пытаюсь сделать свой код максимально пригодным для повторного использования и столкнулся с проблемой при попытке передать аргумент-конструктор в класс, используемый в качестве параметра типа.

В настоящее время у меня естьthis:

    public sealed class SubmitForm : DerivedClass
    {            
    }

    public void TestMethod_Simulated()
    {
        var foo = GetObject<SubmitForm>();
        SubmitData(foo);
    }

    private void SubmitData(SubmitForm form)
    {
        // Do work 
    }

    public T GetObject<T>()
        where T : class
    {
        // Work
    }

Это работало, потому что не было явного конструктора и параметра для SubmitForm.Однако я хочу расширить функциональность и потребовать явного конструктора, ожидающего аргумент.

После добавления конструктора я хочу вызвать «GetObject» с параметром типа «SubmitForm», ВКЛЮЧАЯ аргумент для его явного конструктора.

Это явно невозможно каким-либо простым способом, но я не хочу верить, что нет способа заставить это работать.

Ниже показано, чего я пытаюсь достичь, который должен использовать класс в качестве параметра типа при создании его экземпляра для доступа к созданному мной конструктору:

    public sealed class SubmitForm : DerivedClass
    {
        public SubmitForm(EnumType typeVar)
        {
            _derivedVar = typeVar;
        }
    }

    public void TestMethod_Simulated()
    {
        var foo = GetObject<new SubmitForm(EnumType.FormA)>();
        SubmitData(foo);
    }

    private void SubmitData(SubmitForm form)
    {
        // Do work 
    }

    public T GetObject<T>()
        where T : class
    {
        // Work
    }

Надеюсь, это имеет смысл.Я не могу найти способ сначала создать экземпляр класса И затем использовать его в качестве параметра типа.

1 Ответ

0 голосов
/ 04 февраля 2019

Надеюсь, это имеет смысл.Кажется, я не могу найти способ сначала создать экземпляр класса И затем использовать его как параметр типа

Что ж, невозможно передать экземпляр классакак параметр общего типа.Параметр типа - это просто заполнитель для типа объекта.Компилятор использует его, чтобы вывести тип и заменить T реальным типом.Это не имеет ничего общего с фактическими параметрами.

Если вы хотите использовать конкретный экземпляр класса SubmitForm в своей функции, вы можете сначала создать экземпляр:

var submitForm = new SubmitForm(EnumType.FormA);

И затем изменитьваша функция принимает аргумент типа T:

public T GetObject<T>(T instance)
    where T : class
{
   // .. do something with instance
}

И теперь вы можете сделать вызов новой перегрузки:

var someResult = GetObject(submitForm);

Однако из вашего примера кода это не яснозачем вообще нужны параметры универсального типа.Кажется, что вы также можете изменить сигнатуру функции GetObject с T GetObject<T>() на SubmitForm GetObject(SubmitForm form)

Обычно мы используем параметры типа, когда у нас есть универсальная функция, которая должна выполнять более или менее ту же логикудля разных типов, и мы не хотим дублировать один и тот же код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...