segunda-feira, 9 de janeiro de 2012

C#: Invocar um construtor (com parâmetros) a partir de um metodo genérico .Net

Exemplo para construir uma instância de uma classe a partir de um método genérico, isto pode ser útil para usar um design pattern tipo Factory.

/* O objectivo deste método é invocar o construtor de qualquer classe que seja MyClass1 ou que herde desta e que não tenha o construtor sem parâmetros porque, para isso, bastaria usar além do where a keyword new, ex:  where T : ... new()  */

public T myGenericMethod(string p1, int p2) where T : MyClass1

     System.Reflection.ConstructorInfo constructorInfo =
            typeof(T).GetConstructor(new Type[] { typeof(string), typeof(int) });
 
    T myObject =
          (T)constructorInfo.Invoke(new object[] { p1, p2});

    return myObject;
}

Definindo esta função genérica posso instanciar qualquer classe derivada de  myClass1 que tenha um construtor com uma string e um inteiro como parâmetros. Por exemplo, supondo que existe uma classe chamada MyClass2 que herde de MyClass1:

/* exemplo de classe */
public class MyClass2 : MyClass1 { ... }

/* exemplo como usar o método */
MyClass2 exemplo =
        myGenericMethod("teste", 123);

Claro que isto não tem grandes vantagens assim à primeira vista, mas podemos centralizar operações criando o conceito de Factory.

Sem comentários:

Enviar um comentário