2010-11-22 15 views

Respuesta

7

Una opción es volver a escribir esto para obligar a la persona que llama para pasar en un método de fábrica/lambda

public T GetObject<T>(Func<string,T> func) 
{ 
    return func("Hello"); 
} 

El sitio de llamada se modificaría para tener este aspecto

GetObject(x => new T(x)); 
+0

La firma del método se vuelve mucho más complicada que la solución de dtb, pero me gusta la verificación en tiempo de compilación que viene con él. Compensaciones, supongo. – Smashery

11

Sí, pero sólo sin tiempo de compilación comprobar si el constructor realmente existe: Activator.CreateInstance

public T GetObject<T>() 
{ 
    return (T)Activator.CreateInstance(typeof(T), "Hello"); 
} 
+0

Así que si el '(string) 'constructor no existe, ¿será un error de tiempo de ejecución? – Smashery

+0

@Smashery: Exacto. Lanzará una excepción si 'T' no tiene un constructor público' (string) '. – dtb

+0

¡Muchas gracias! Apesta, solo puedo elegir una "respuesta correcta", ¡pero gracias por enseñarme algo nuevo! – Smashery

0

No. En el momento en que no se puede utilizar constructores parametrizados con los tipos genéricos ya que no se puede definir en dónde.

El uso del Activador no es el mismo, y no creo que la respuesta a su pregunta, pero puede usarlo, por supuesto.

Cuestiones relacionadas