Определить класс по типу интерфейса - PullRequest
0 голосов
/ 15 июля 2009

У меня есть интерфейс и некоторые классы, которые наследуют его.

public interface IFoo {}
public class Bar : IFoo {}
public class Baz : IFoo {}

Если я получу типы, которые реализуют IFoo, как я могу решить, будет ли тип представлять Bar или Baz (без фактического создания объекта)?

// Get all types in assembly.
Type[]          theTypes = asm.GetTypes();

// See if a type implement IFoo.
for (int i = 0; i < theTypes.Length; i++)
{
    Type    t = theTypes[i].GetInterface("IFoo");
    if (t != null)
    {
        // TODO: is t a Bar or a Baz?
    }
}

Ответы [ 6 ]

4 голосов
/ 15 июля 2009
if (theTypes[i] == typeof(Bar))
{
    // t is Bar
} 
else if (theTypes[i] == typeof(Baz))
{
    // t is Baz
}
3 голосов
/ 15 июля 2009

t не является ни Bar, ни Baz - это IFoo. theTypes[i] - это Bar или Baz.

2 голосов
/ 15 июля 2009

Когда вы делаете GetInerface, вы получаете только интерфейс. Вам нужно только получить типы, которые реализуют этот интерфейс, вот так.

var theTypes = asm.GetTypes().Where(
                                    x => x.GetInterface("IFoo") != null
                                    ); 

Теперь вы можете просмотреть их и сделать это. или используйте переключатель.

foreach ( var item in theTypes )
  {
     if ( item == typeof(Bar) ) 
      {
         //its Bar
      }
     else if ( item == typeof(Baz) )
      {
        ///its Baz
      }
  }
1 голос
/ 06 января 2010

Я думаю, что это поможет с вашей проблемой:

IFoo obj = ...;
Type someType = obj.GetType();
if (typeof(Bar).IsAssignableFrom(someType))
    ...
if (typeof(Baz).IsAssignableFrom(someType))
    ...
0 голосов
/ 15 июля 2009

Строго типизированное решение "Реализует ли тип X интерфейс I", поддерживающее анализ / рефакторинг:

Type x = ...;
bool implementsInterface = Array.IndexOf(x.GetInterfaces(), typeof(I)) >= 0;

Тем не менее, я действительно понятия не имею, чего вы пытаетесь достичь.

0 голосов
/ 15 июля 2009

Я что-то упустил?

theTypes[i] это тип.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...