uso - Métodos genéricos de C#, parámetros de tipo en la restricción del constructor nuevo()
metodos parametrizados (3)
¿Hay una manera de crear un método genérico que use la restricción del constructor new()
para requerir clases con constructores de tipos específicos?
Por ejemplo:
Tengo el siguiente código:
public T MyGenericMethod<T>(MyClass c) where T : class
{
if (typeof(T).GetConstructor(new Type[] { typeof(MyClass) }) == null)
{
throw new ArgumentException("Invalid class supplied");
}
// ...
}
¿Es posible tener algo como esto en su lugar?
public T MyGenericMethod<T>(MyClass c) where T : new(MyClass)
{
// ...
}
EDIT: Hay una sugerencia sobre esto. ¡Vota para que podamos tener esta función en C #!
No, no es posible en C # restringir el tipo genérico para tener un constructor de una firma específica. Sólo el constructor sin parámetros es compatible con new ().
No. Desafortunadamente, las restricciones genéricas solo le permiten incluir:
where T : new()
Lo que especifica que hay un constructor predeterminado sin parámetros. No hay forma de restringir un tipo con un constructor que acepte un tipo de parámetro específico.
Para obtener más información, consulte Restricciones en los parámetros de tipo .
Realmente no; C # solo soporta restricciones de constructor sin argumentos.
La solución que uso para los constructores de argumentos genéricos es especificar el constructor como un delegado:
public T MyGenericMethod<T>(MyClass c, Func<MyClass, T> ctor) {
// ...
T newTObj = ctor(c);
// ...
}
entonces al llamar:
MyClass c = new MyClass();
MyGenericMethod<OtherClass>(c, co => new OtherClass(co));