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.

quinta-feira, 5 de janeiro de 2012

Coded UI teclas especiais

No âmbito dos Coded UI (testes automáticos no Visual Studio 2010) ou de outras aplicações interactivas em que temos que simular comportamentos como se fossem o utilizador a escrever podemos usar a classe Keyboard:

Esta classe encontra-se no namespace: Microsoft.VisualStudio.TestTools.UITesting

Em conjunto com estas tabelas de referência:
http://msdn.microsoft.com/en-us/library/fx2k26ca%28v=vs.90%29.aspx
http://msdn.microsoft.com/en-us/library/dd433886.aspx
é possivel enviar comandos como se estivessemos a escrever no teclado, exemplos:

Keyboard.SendKeys("{DOWN}", ModifierKeys.Alt);
Keyboard.SendKeys("{RIGHT}");
Keyboard.SendKeys("{ENTER}");

Também é possivel definir o nº de repetições:
Keyboard.SendKeys("{LEFT 5}");
isto é o equivalente a pressionar a tecla para a esquerda 5 vezes.

Atualização:
Na assembly System.Windows.Forms.dll estão disponível os  métodos equivalentes ao anterior:
Exemplo:
System.Windows.Forms.SendKeys.SendWait("{b 10}");

Nota: esta última pode ser apenas dedicada aos WindowsForms...

#region Assembly Microsoft.VisualStudio.TestTools.UITesting.dll, v4.0.30319
// c:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\PublicAssemblies\Microsoft.VisualStudio.TestTools.UITesting.dll
#endregion

segunda-feira, 2 de janeiro de 2012

.NET: Parsing e manipulação da QueryString

Em .NET existe o método HttpUtility.ParseQueryString quer permite efetuar o parsing da querystring devolvendo um objecto do tipo NameValueCollection
O objecto, do tipo NameValueCollection, permite fazer a manipulação da querystring suportando as seguintes operações:
  • adicionar, remover propriedades
  • consultar e modificar o valor das propriedades.

Exemplo:

NameValueCollection queryString = HttpUtility.ParseQueryString("?displaycode=deseja&feliz=2011");


// Obter o valor da propriedade
string ano = queryString["feliz"];

// Alterar o valor da propriedade
queryString["feliz"] = "2012";


// Remover a propriedade
queryString.Remove("feliz");

// Adicionar a propriedade
queryString.Add("feliz", "2012");

// Resultado: displaycode=deseja&feliz=2012
string resultado = queryString.ToString();