Pregunta

Tengo un proveedor de datos que contiene una colección de entidades. Sólo quiero ser capaz de crear una nueva entidad a través del proveedor de datos.

es decir, para crear un nuevo registro que necesito utilizar:

Entity entity = Provider.AddNew();
enity.set_Properties... etc

Mi problema es que si me puse mis entidades en Internal, System.Activator no puede crear una instancia de ellos. Cada uno de mis Proveedores de datos utiliza una clase base con el tipo genérico de la entidad pasa a través.

Así que en el momento de mi método AddNew () contiene lo siguiente:

public T AddNew()
{
  T added = Activator.CreateInstance<T>();
  this.Collection.Add(added);
  return added;
}

No es, obviamente, el fin del mundo si puedo crear una instancia de una nueva entidad manualmente fuera de los espacios de nombres de proveedor de datos, pero parece no tener sentido teniendo en cuenta que no hay manera de nunca guardarlos, así que por qué dar la opción de hacerlo?

EDIT: Se me olvidó mencionar que todos mis proveedores, entidades, etc están en el mismo espacio de nombres

.
¿Fue útil?

Solución

No utilice el activador, que se basa en un constructor público. En lugar de utilizar la reflexión para encontrar el constructor sin parámetros y luego llamarlo. Algo a lo largo de estas líneas:

Type t = typeof(MyType);
var parameterlessCtor = (from c in t.GetConstructors(
  BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance)
    where c.GetParameters().Length == 0
    select c).FirstOrDefault;
if(parameterlessCtor != null) instance = parameterlessCtor.Invoke(null);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top