Реализации интерфейса посредством Отражения

В Java все находится в форме класса.

Если вы хотите использовать любой объект, тогда у вас есть две фазы:

  1. Объявить
  2. Инициализация

Пример:

  • Объявление: Object a;
  • Инициализация: a=new Object();

То же самое для концепции массива

  • Объявление: Item i[]=new Item[5];
  • Инициализация: i[0]=new Item();

Если вы не дают секцию инициализации, тогда возникает NullpointerException.

39
задан Sam 24 June 2013 в 01:50
поделиться

5 ответов

Ответ - это; это перерывает домен целого приложения - то есть, каждый блок, в настоящее время загружаемый Вашим приложением.

/// <summary>
/// Returns all types in the current AppDomain implementing the interface or inheriting the type. 
/// </summary>
public static IEnumerable<Type> TypesImplementingInterface(Type desiredType)
{
    return AppDomain
           .CurrentDomain
           .GetAssemblies()
           .SelectMany(assembly => assembly.GetTypes())
           .Where(type => desiredType.IsAssignableFrom(type));
}

Это используется как это;

var disposableTypes =  TypesImplementingInterface(typeof(IDisposable));

можно также хотеть, чтобы эта функция нашла фактические конкретные типы - т.е. отфильтровывание кратких обзоров, интерфейсов и универсальных определений типа.

public static bool IsRealClass(Type testType)
{
    return testType.IsAbstract == false
         && testType.IsGenericTypeDefinition == false
         && testType.IsInterface == false;
}
58
ответ дан Patrick D'Souza 27 November 2019 в 02:34
поделиться

Взгляните на Assembly.GetTypes() метод. Это возвращает все типы, которые могут быть найдены в блоке. Все, что необходимо сделать, должно выполнить итерации через каждый возвращенный тип и проверку, если это реализует необходимый интерфейс.

На способа сделать так использует Type.IsAssignableFrom метод.

Вот пример. myInterface интерфейс, реализации которого Вы ищете.

Assembly myAssembly;
Type myInterface;
foreach (Type type in myAssembly.GetTypes())
{
    if (myInterface.IsAssignableFrom(type))
        Console.WriteLine(type.FullName);
}

я полагаю, что это не очень эффективный способ решить Вашу проблему, но по крайней мере, это - хорошее место для запуска.

5
ответ дан Patrick D'Souza 27 November 2019 в 02:34
поделиться
Assembly assembly = Assembly.GetExecutingAssembly();
List<Type> types = assembly.GetTypes();
List<Type> childTypes = new List<Type>();
foreach (Type type in Types) {
  foreach (Type interfaceType in type.GetInterfaces()) {
       if (interfaceType.Equals(typeof([yourinterfacetype)) {
            childTypes.Add(type)
            break;
       }
  }
}

, Возможно, что-то как этот....

4
ответ дан Adam Driscoll 27 November 2019 в 02:34
поделиться

Вы имеете в виду все интерфейсы, которые реализует Тип?

Как это:

ObjX foo = new ObjX();
Type tFoo = foo.GetType();
Type[] tFooInterfaces = tFoo.GetInterfaces();
foreach(Type tInterface in tFooInterfaces)
{
  // do something with it
}

Hope tha helpts.

1
ответ дан Alex Duggleby 27 November 2019 в 02:34
поделиться

Необходимо циклично выполниться по всем блокам, которыми Вы интересуетесь. От блока можно получить все типы, которые он определяет. Обратите внимание на это, когда Вы сделаете AppDomain. CurrentDomain. Блоки Вы только получаете блоки, которые загружаются. Блоки не загружаются, пока они не необходимы, так, чтобы средства, что необходимо явно загрузить блоки, прежде чем Вы начнете искать.

1
ответ дан Hallgrim 27 November 2019 в 02:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: