Pergunta

Eu tenho um provedor de dados que contém uma coleção de entidades. Eu só quero ser capaz de criar uma nova entidade por meio do provedor de dados.

ou seja, para criar um novo registro Eu preciso usar:

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

Meu problema é que se eu definir o meu entidades Interno, System.Activator não pode criar uma instância deles. Cada um dos meus fornecedores de dados usa uma classe base com o tipo genérico da entidade passou.

Então, no momento meu método AddNew () contém o seguinte:

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

É, obviamente, não é o fim do mundo se eu pode instanciar uma nova entidade manualmente fora dos namespaces provedor de dados, mas parece inútil, considerando que não há maneira de guardá-las sempre, então por que dar a opção de fazê-lo?

EDIT:. Esqueceu de mencionar que todos os meus fornecedores, entidades, etc estão no mesmo namespace

Foi útil?

Solução

Não use o Activator, que conta com um construtor público. Em vez disso usar o reflexo para encontrar o construtor sem parâmetros e, em seguida, chamá-lo. Algo ao longo destas linhas:

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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top