Segunda-feira, Agosto 11, 2008

Interfaces de uma classe pela hierarquia em C#

Algumas vezes é necessário por reflexão obter as interfaces de uma determinada classe, o que pode ser feito facilmente com o método Type.GetInterfaces(). Entretanto, e se tivermos o seguinte cenário abaixo?

interface IA {}
interface IB : IA {}
interface IC : IA {}

class A : IA {}
class B : A, IB {}
class C : A, IC {}


Uma herança relativamente comum, mas se pedirmos a lista de interfaces do tipo C pelo método descrito acima, esse irá retornar: IA, IC. Mas pera aí, a interface IC herda da IA, sendo assim somente a interface IC seria suficiente... Pra resolver esse problema, é necessário realizar uma combinação dentre as interfaces do tipo e as desejadas.

Criei o seguinte algoritmo, como método de extensão, que resolve o problema e ainda filtra as interfaces pra um determinado tipo desejado:

public static IEnumerable GetInterfaces(this Type type)
{
Type[] interfaces = type.GetInterfaces().Where(typeof(T).IsAssignableFrom).ToArray();
var aux = new Type[interfaces.Length];
int auxIndex = 0;

for (int i = 0; i < interfaces.Length; i++)
{
if (interfaces[i] == null)
continue;

if (aux[auxIndex] == null)
{
aux[auxIndex] = interfaces[i];
interfaces[i++] = null;
}

for (int j = i; j < interfaces.Length; j++)
{
if (interfaces[j] == null)
continue;

if (!aux[auxIndex].IsAssignableFrom(interfaces[j]))
continue;

aux[auxIndex] = interfaces[j];
interfaces[j] = null;
}

auxIndex++;
}

for (int i = 0; i < aux.Length; i++)
{
if (aux[i] != null)
yield return aux[i];
}
}


Não está 100%, algumas melhorias poderiam ser realizadas, mas funciona muito bem para o problema. :P


Obs.: Se alguém souber como eu coloco esse código formatado dá uma dica ai heheh...

0 comentários: