terça-feira, outubro 02, 2007

Método genérico

O meu problema passava por ter de criar métodos com implementações iguais, só diferindo no tipo dos parâmetros recebidos, pois os objectos que eu queria passar como parâmetro eram em tudo distintos à excepção das propriedades acedidas nesses métodos. Exemplo:

Group[] groups = null;
Tone[] tones = null;

GetName(contact.GroupId, groups);
GetName(contact.ToneId, tones);

private string GetName(int Id, Group[] data)
{
foreach (Group info in data)
{
if(info.Id == Id) return info.Name;
}
return null;
}

private string GetName(int Id, Tone[] data)
{
foreach (Tone info in data)
{
if(info.Id == Id) return info.Name;
}
return null;
}
Solução 1: Criar uma interface que será implementada pelos dois objectos, e a interface terá os campos e/ou métodos que se desejem ter em comum:

Group[] groups = null;
Tone[] tones = null;

GetName(contact.GroupId, groups);
GetName(contact.ToneId, tones);

private string GetName(int Id, ShareInterface[] data)
{
foreach (ShareInterface info in data)
{
if(info.Id == Id) return info.Name;
}
return null;
}

Solução 2: Esta solução foi a que utilizei para o meu caso pois a Solução 1 tem um problema, no caso dos objectos serem obtidos através de uma black box é impossível criar uma interface para ambos os objectos implementarem. A solução é a seguinte:


Group[] groups = null;
Tone[] tones = null;

GetName(contact.GroupId, groups);
GetName(contact.ToneId, tones);

private string GetName(int Id, object[] data)
{
foreach (object info in data)
{
System.Reflection.PropertyInfo prop = info.GetType().GetProperty("Id");
int tester = (int)prop.GetValue(info, null);
if (tester == Id)
return info.GetType().GetProperty("Name").ToString();
}
return null;
}

Sem comentários: