Tag Archives: C#

C# – Obtendo os valores de todas as propriedades de um objeto

Tinha esquecido desse snippet. Com certeza ajuda, principalmente na depuração de aplicações.

Quando precisar saber os valores de todas as propriedades de um objeto, ao invés de sair destacando uma por uma, a rotina abaixo devolve os valores das propriedades de um determinado objeto, passado por parâmetro:

public static Dictionary<string, object> getPropertyValues(object o)
{
	Dictionary<string, object> propertyValues = new Dictionary<string, object>();
	Type ObjectType = o.GetType();
	System.Reflection.PropertyInfo[] properties = ObjectType.GetProperties();
	foreach (System.Reflection.PropertyInfo property in properties)
	{
		propertyValues.Add(property.Name, property.GetValue(o, null));
	}
	return propertyValues;
}

O código retorna um Dictionary, onde a string é o nome da propriedade e o object, seu valor. Inevitavelmente, é preciso o uso de Reflection para obter tais informações, o que provavelmente o leitor já esperava, certo? Daí para frente é só utilizar como bem entender.

Bom proveito.

C# – Referenciando tipos anônimos em controles DataBind

Novas funcionalidades são sempre bem vindas, mas as novidades sempre trazem mais novidades, situações, problemas, enfim, o trivial.

Os tipos anônimos do C# 3.0 economizam um bocado de tempo quando se precisa extrair algo de uma lista baseada em uma query LINQ. Vou dar um exemplo para elucidar a situação. Quando você extrai de uma determinada lista apenas alguns campos, por exemplo, do objeto:

public class Pessoa
{
	public string Nome { get; set; }
	public string SobreNome{ get; set; }
	public string Curso { get; set; }
	public string Escola { get; set; }
}

E queremos tirar uma lista única de Curso/Escola. Fácil, é só usar o Distinct, gerando algo como:

(from p in PessoaList
select new { p.Curso, p.Escola }).Distinct();

Mais fácil ainda se atribuir o resultado do código acima direto ao DataSource de um Repeater ou GridView. Mas, como fazer para coletar os valores e fazer o bind e um tipo que não existe, por exemplo, no evento ItemDataBound ou RowDataBound? Se você ativar o Watcher sobre o e.Item.DataItem, você verá um tipo anônimo referenciado de uma forma um pouco estranho. Se tentar usar no código, não funciona.

Como resolver? Não tem jeito: Reflection!

Se você tiver certeza de que a propriedade existe, dá para fazer uma referência direta:

e.Item.GetType().GetProperty("Escola").GetValue(e.Item, null)

Se houver dúvida quanto a existência, algumas verificações precisarão ser feitas. Deixo abaixo do código do colega leppie do StackOverFlow que faz tais verificações:

object o = e.Row.DataItem;
Type t = o.GetType();
PropertyInfo pi = t.GetProperty("StringProperty");
if (pi != null && pi.PropertyType == typeof(string))
{
  // the property exists!
  string s = pi.GetValue(o, null) as string;
  // we have the value
  // insert your code here
  // PROFIT!  :)
}

Bom proveito!

Referências:

http://stackoverflow.com/questions/607433/net-databinding-referencing-anonymous-type-properties

.NET – Habilitando o OpenFileDialog no controle PropertyGrid

Poucou utilizado em sistemas tradicionais, infelizmente, o controle PropertyGrid disponibilizado a partir do .NET Framework 2.0 possui um forma prática de exibir características de um determinado objeto ou controle. Um tutorial bem completo deste pode ser visto aqui.

Tudo certo. Em um de seus usos, fiquei curioso em saber como alguns sistemas, inclusive o Visual Studio e outras IDEs Microsoft conseguir transformar algumas das caixas de valores do PropertyGrid campos OpenFileDialog, ou seja, quando este precisar conter o caminho de um arquivo, que aparecesse o pequeno botão a direta do campo para exibir tal funcionalidade.

Bom, a resposta é simples. A propriedade que irá expor o valor deve conter os seguintes atributos:

[EditorAttribute(typeof(System.Windows.Forms.Design.FileNameEditor),
typeof(System.Drawing.Design.UITypeEditor))]
public string CaminhoDoArquivo { get; set; }

A mágica é feita pelo atributo System.Windows.Forms.Design.FileNameEditor. O projeto precisa referenciar a bibliotecas System.Windows.Forms e System.Design para alcançar as classes mencionadas. A aparência fica dessa forma:

Também é possível adicionar a caixa de mapeamento de diretório, trocando o valor para System.Windows.Forms.Design.FolderNameEditor. O funcionamento do clique nos botões dispensa explicações, bem como a versão do código para VB.NET, certo?

Referências

http://stackoverflow.com/questions/170791/how-can-i-get-an-openfiledialog-in-a-custom-controls-property-grid

Bom proveito!

C# – Lendo um arquivo texto linha a linha

Tinha até esquecido como era programar em .NET. Ando meio longe da linguagem por conta de alguns projetos em outra tecnologia. Mas uma necessidade recente me levou a precisar construir um pequeno aplicativo que resolvesse um problema, algo bem focado.

Bom, das necessidades mais básicas, veio a de ler um arquivo texto linha a linha, coisa que não fazia desde o primeiros labs que fazia em .NET, lá atrás, quando ainda estava aprendendo. Bom, vai o código que construí para servir de exemplo para quem precisar:

using System;
using System.IO; 
 
namespace TextFileLineByLine
{
    class Program
    {
        static void Main( string[] args )
        {
            string filePath = @"c:\temp\test.txt";
            string line; 
 
            if (File.Exists(filePath))
            {
				using (StreamReader reader = new StreamReader(filePath))
                {
                    while ((line = reader.ReadLine()) != null)
                    {
                        Console.WriteLine(line);
                    }
                }
            } 
            Console.ReadLine();
        }
    }
}

O código se baseou no exemplo do colega timm, mas dei uma simplificada, deixando o código bem mais enxuto.

Bom proveito!