Mostrar mensagens com a etiqueta genéricos. Mostrar todas as mensagens
Mostrar mensagens com a etiqueta genéricos. Mostrar todas as mensagens

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.

segunda-feira, 12 de dezembro de 2011

Função genérica para converter string num enumerado.

Uma  forma genérica para converter uma string num Enum, uso isto na forma de uma extensão.
Exemplo de utilização:
string s = "Primeiro";
PosicaoEnum teste = s.ToEnum<PosicaoEnum>();

public static T ToEnum<T>(this string s)
{
    T[] possibleValues = (T[]) Enum.GetValues(typeof(T));
    foreach(T val in possibleValues){
        string valString = val.ToString();
        if (valString == s)
        {
            return val;
        }
    }
    throw new ArgumentException(
        string.Format(
            "Cannot find \"{0}\" in the enum \"{1}\".",
            s, typeof(T).ToString()));
}