Así que esto es lo que estoy tratando de hacer.donde cláusula en un constructor en C#?
Estoy creando una clase genérica que asigna el tipo especificado por el parámetro genérico de una de dos maneras, determinado por qué constructor sobrecargado se utiliza.
Aquí está el ejemplo:
class MyClass<T>
where T : class
{
public delegate T Allocator();
public MyClass()
{
obj = new T();
}
public MyClass(Allocator alloc)
{
obj = alloc();
}
T obj;
}
Esta clase requiere que el tipo T es un refType en todos los casos. Para el constructor predeterminado, queremos crear una instancia de T a través de su constructor predeterminado. Me gustaría poner un where T : new()
en mi constructor por defecto, así:
public MyClass()
where T : new()
{
obj = new T();
}
Sin embargo, esto no es válido C#. Básicamente, solo quiero agregar la restricción en el tipo T para tener un constructor predeterminado solo cuando se usa el constructor predeterminado de MyClass().
En el segundo constructor de MyClass, dejamos que el usuario determine cómo asignar para T con su propio método de asignación, por lo que obviamente tiene sentido que MyClass no aplique T sea constructivo predeterminado en todos los casos.
Tengo la sensación de que tendré que usar la reflexión en el constructor predeterminado para esto, pero espero que no.
Sé que esto se puede hacer porque la clase Lazy<T>
en .NET 4.0 no requiere que T sea construible por defecto en el nivel de clase, sin embargo, tiene constructores similares a los de mi ejemplo. Me gustaría saber cómo lo hace al menos Lazy<T>
.
Cambiando mi respuesta a esta ... Leí algo sobre 'Activator.CreateInstance()' y de hecho no hace la comprobación de la construcción predeterminada en tiempo de compilación (que yo prefiero). Fui con la clase de fábrica genérica en su lugar. –
¿Cómo se puede definir MyClass dos veces sin usar la palabra clave 'parcial'? No estoy familiarizado con esta sintaxis. –
@Robert Dailey: No he declarado 'MyClass' dos veces: he declarado' MyClass' (no genérico) y 'MyClass' (genérico con un parámetro de tipo). Son tipos separados, al igual que 'Nullable' y' Nullable 'son tipos separados. –