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 IEnumerableGetInterfaces (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:
Postar um comentário