Существует ли общий конструктор с ограничением параметра в С#?

В С# вы можете установить ограничение на общий метод, например:

public class A {

    public static void Method<T> (T a) where T : new() {
        //...do something...
    }

}

Если вы укажете, что T должен иметь конструктор, который не требует параметров. Мне интересно, есть ли способ добавить ограничение типа "существует конструктор с параметром float[,]?"

Следующий код не компилируется:

public class A {

    public static void Method<T> (T a) where T : new(float[,] u) {
        //...do something...
    }

}

Обходной путь также полезен?

4b9b3361

Как вы нашли, вы не можете этого сделать.

В качестве обходного пути я обычно предоставляю делегат, который может создавать объекты типа T:

public class A {

    public static void Method<T> (T a, Func<float[,], T> creator) {
        //...do something...
    }

}
110
ответ дан 05 дек. '09 в 20:41
источник

Нет такой конструкции. Вы можете указать только ограничение пустого конструктора.

Я работаю над этой проблемой с методами лямбда.

public static void Method<T>(Func<int,T> del) {
  var t = del(42);
}

Использование случая

Method(x => new Foo(x));
36
ответ дан 05 дек. '09 в 20:40
источник

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

Используется таким образом, чтобы вы не могли установить ограничение на конструктор в шаблоне. Если конструктор отсутствует, исключение должно обрабатываться во время выполнения, а не получать ошибку во время компиляции.

// public static object CreateInstance(Type type, params object[] args);

// Example 1
T t = (T)Activator.CreateInstance(typeof(T));
// Example 2
T t = (T)Activator.CreateInstance(typeof(T), arg0, arg1, arg2, ...);
// Example 3
T t = (T)Activator.CreateInstance(typeof(T), (string)arg0, (int)arg1, (bool)arg2);
29
ответ дан 26 марта '12 в 11:13
источник

Вот обходной путь для этого, который я лично считаю весьма эффективным. Если вы думаете о том, что является общим параметрическим ограничением конструктора, это действительно сопоставление между типами и конструкторами с определенной сигнатурой. Вы можете создать свое собственное сопоставление с помощью словаря. Поместите их в статический класс factory ", и вы можете создавать объекты различного типа, не беспокоясь о том, чтобы каждый раз создавать конструктор лямбда:

public static class BaseTypeFactory
{
   private delegate BaseType BaseTypeConstructor(int pParam1, int pParam2);

   private static readonly Dictionary<Type, BaseTypeConstructor>
   mTypeConstructors = new Dictionary<Type, BaseTypeConstructor>
   {
      { typeof(Object1), (pParam1, pParam2) => new Object1(pParam1, pParam2) },
      { typeof(Object2), (pParam1, pParam2) => new Object2(pParam1, pParam2) },
      { typeof(Object3), (pParam1, pParam2) => new Object3(pParam1, pParam2) }
   };

то в вашем общем методе, например:

   public static T BuildBaseType<T>(...)
      where T : BaseType
   {
      ...
      T myObject = (T)mTypeConstructors[typeof(T)](value1, value2);
      ...
      return myObject;
   }
12
ответ дан 08 февр. '12 в 10:48
источник

Нет. На данный момент единственное ограничение конструктора, которое вы можете указать, это конструктор no-arg.

4
ответ дан 05 дек. '09 в 20:39
источник