Bien, estoy buscando algo de entrada, estoy bastante seguro de que esto no es actualmente compatible con .NET 3.5, pero aquí va.Cómo evitar limitaciones en restricciones de tipo genérico en C#?
Quiero requerir un tipo genérico pasado a mi clase a tener un constructor de esta manera:
new(IDictionary<string,object>)
por lo que la clase se vería así
public MyClass<T> where T : new(IDictionary<string,object>)
{
T CreateObject(IDictionary<string,object> values)
{
return new T(values);
}
}
Sin embargo, el compilador no admite esto, realmente no sabe lo que estoy preguntando.
Algunos de ustedes pueden preguntar, ¿por qué quieren hacer esto? Bueno, estoy trabajando en un proyecto favorito de un ORM, así que obtengo valores de la BD y luego creo el objeto y cargo los valores.
Pensé que sería más limpio permitir que el objeto simplemente se cree a sí mismo con los valores que le doy. Por lo que puedo decir, tengo dos opciones:
1) Utilice la reflexión (que estoy tratando de evitar) para tomar la matriz PropertyInfo [] y luego usar eso para cargar los valores.
2) requieren T para soportar una interfaz de este modo:
ILoadValues interfaz pública { LoadValues nulos (valores IDictionary); }
y luego hacer esto
public MyClass<T> where T:new(),ILoadValues
{
T CreateObject(IDictionary<string,object> values)
{
T obj = new T();
obj.LoadValues(values);
return obj;
}
}
El problema que tengo con la interfaz supongo que es filosófico, yo realmente no quiero exponer un método público para que la gente se cargan los valores. Utilizando el constructor la idea era que si tuviera un objeto como éste
namespace DataSource.Data
{
public class User
{
protected internal User(IDictionary<string,object> values)
{
//Initialize
}
}
}
Mientras el MyClass<T>
estaba en la misma Asamblea el constructor estaría disponible. Personalmente creo que la restricción de tipo en mi opinión debería preguntar (¿Tengo acceso a este constructor? ¡Lo hago, genial!)
De todos modos cualquier entrada es bienvenida.
Lo configuré como la respuesta porque nunca supe que podría ocultar una implementación de interfaz al declararla explícitamente. O al menos no hizo clic hasta que lo escribió. ¡Gracias! – Jose