2010-07-29 14 views
15

¿Hay alguna 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?C# métodos genéricos, escriba parámetros en la nueva() restricción del constructor

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 a suggestion respecto a esto. Por favor vota para que podamos tener esta característica en C#!

+1

Estoy un poco confundido. ¿Qué estás tratando de lograr exactamente? ¿Tomará el constructor un parámetro de MyClass o limitará T a MyClass? –

Respuesta

28

No realmente; C# solo admite restricciones de constructor sin argumentos.

La solución que utilizo para los constructores arg genéricos es especificar el constructor como delegado:

public T MyGenericMethod<T>(MyClass c, Func<MyClass, T> ctor) { 
    // ... 
    T newTObj = ctor(c); 
    // ... 
} 

continuación, al llamar:

MyClass c = new MyClass(); 
MyGenericMethod<OtherClass>(c, co => new OtherClass(co)); 
4

No. Desafortunadamente, las limitaciones genéricas sólo se permitirá incluir :

where T : new() 

Lo que especifica que hay un error predeterminado, sin parámetros Instructor. No hay forma de restringir a un tipo con un constructor que acepta un tipo de parámetro específico.

Para obtener más información, consulte Constraints on Type Parameters.

+0

Sí, leí ese artículo, pero no era muy específico sobre la nueva() restricción. Gracias de todos modos, supongo que dejaré mi validación justo donde está ... – Meryovi

+0

@Joel: la opción que muestran es la ÚNICA opción para la nueva() restricción. No hay manera de agregar parámetros. –

2

No, no es posible en C# restringir el tipo genérico para tener un constructor de una firma específica. Solo el constructor sin parámetros es compatible con new().

+1

¡Aunque sería una buena adición! – Meryovi

Cuestiones relacionadas