Как ограничить универсальный тип, чтобы иметь конструктор, который принимает определенные параметры?

Да, абсолютно. C99 представил VLA или переменную длину массива. Некоторый простой код будет таким:

#include <stdio.h>

int main (void) {

    int arraysize;
    printf("How bid do you want your array to be?\n");
    scanf("%d",&arraysize);
    int ar[arraysize];  
    return 0;
}
17
задан svick 16 March 2012 в 17:40
поделиться

3 ответа

Это невозможно. Я хотел бы видеть «статические интерфейсы» , чтобы справиться с этим, но не ожидайте их в ближайшее время ...

Альтернативы:

  • Укажите делегата, который будет действовать как фабрика для T
  • Укажите другой интерфейс, который будет действовать как фабрика для T
  • Укажите интерфейс на самом T для инициализации (и добавьте ограничение, чтобы T реализовал интерфейс).

Первые два действительно эквивалент. В основном вы бы изменили свой прокси-класс на что-то вроде этого:

public class GenericProxy<T>
    where T: ClientBase, new()
{
    string _configName;
    T _proxy;
    Func<string, T> _factory;

    public GenericProxy(Func<string, T> factory, string configName)
    {
        _configName = configName;
        _factory = factory;
        RefreshProxy();
    }

    void RefreshProxy() // As an example; suppose we need to do this later too
    {
        _proxy = _factory(_configName);
    }
}

(я предполагаю, что вы захотите создать больше экземпляров позже - иначе вы могли бы также передать экземпляр T в конструктор.)

24
ответ дан 30 November 2019 в 12:27
поделиться

К сожалению, то, что вы пытаетесь сделать, невозможно.

Статья MSDN об ограничениях типов

4
ответ дан 30 November 2019 в 12:27
поделиться

Как отмечает Джон, для этого нет встроенной поддержки, но, кроме того, вы можете создать типизированный делегат конструктору (быстрее, чем отражение), используя Expression . Код для этого можно найти в MiscUtil MiscUtil.Linq.Extensions.TypeExt ).

1
ответ дан 30 November 2019 в 12:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: