Método genérico: crear una instancia de un tipo genérico con un argumento

Tengo un método genérico que toma un tipo T, que necesito para poder llamar a un constructor que requiere un solo XmlNode. Actualmente, estoy tratando de hacer eso teniendo una clase base abstracta que tenga los constructores que quiero (más uno sin parámetros, así que no tengo que editar las “subclases” más que para agregar las subclases reales) y restringir por eso. Si bash crear una instancia de una de estas clases, se queja de que:

Cannot create an instance of the variable type 'T' because it does not have the new() constraint 

y si agrego la new() restricción new() , obtengo:

 'T': cannot provide arguments when creating an instance of a variable type 

¿Cómo puedo hacer lo que quiero?

No hay forma de especificar que un parámetro de tipo genérico T debería tener un constructor con parámetros específicos. El hecho de que una clase base tenga un constructor con algunos argumentos no ayuda, porque la clase sustituida no tiene que tener el mismo constructor (por ejemplo, puede llamar al constructor base con algún valor como argumento).

La new() restricción new() se puede usar para requerir solo un constructor sin parámetros. Probablemente sugeriría agregar una restricción de interfaz (por ejemplo, IConstructFromXml ) que tenga un método para inicializar el objeto; luego, puede llamar al método después de crear el objeto utilizando un constructor sin parámetros.

Alternativamente, puede tomar un parámetro de tipo que represente una fábrica para crear valores del tipo especificado. Luego, crearía una instancia de la fábrica y la usaría para crear el valor del tipo que necesita. Algo como:

 void Foo() where TFactory : IFactory where TFactory : new() { var factory = new TFactory(); T val = factory.Create(xmlNode); // Create method is defined in IFactory // ... } 

Donde la IFactory ve así:

 interface IFactory { T Create(XmlNode node); } 

Llamar al método Foo es un poco más complicado en esta versión, porque tiene que especificar explícitamente la fábrica (y también debe implementarla), pero puede estar más cerca de lo que quiere …