Type.GetInterface и вложенные типы - PullRequest
       12

Type.GetInterface и вложенные типы

2 голосов
/ 09 февраля 2009

Я только что обнаружил очень странное поведение с Type.GetInterface и вложенными типами.

Следующий пример кода покажет проблему, я использую Type.FullName интерфейса, чтобы проверить, происходит ли данный тип из этого интерфейса:

public interface IStandardInterface {}
public class StandardClass : IStandardInterface {}

class Program
{
    public interface INestedInterface {}
    public class NestedClass : INestedInterface { }

    static void Main()
    {
        var stdIfName = typeof (IStandardInterface).FullName;
        var nestedIfName = typeof (INestedInterface).FullName;

        var std = typeof(StandardClass).GetInterface(stdIfName);
        var nested = typeof(NestedClass).GetInterface(nestedIfName);
    }
}

Если я выполняю приведенный выше код, он работает для StandardClass, но не для NestedClass.

  • std имеет значение typeof (IStandardInterface)
  • вложенный имеет значение ноль

Это поведение ожидается или ошибка? Если это ожидается, не могли бы вы объяснить, почему?

Я использую .net Framework версии 3.5 SP1.

Ответы [ 3 ]

4 голосов
/ 09 февраля 2009

Расширяя ответ Марка.

Хотя это не задокументировано, API GetInterface будет разбивать имя, которое вы передаете, на основе позиции последнего "." во имя. Все справа от "." предполагается, что это будет короткое имя рассматриваемого интерфейса.

Это создает проблему для вложенных типов, так как они будут иметь имя, которое называется «ConistingTypeName + NestedTypeName». Поэтому, когда вы передаете полное имя в GetInterface, он фактически ищет интерфейс с именем «Program + INestedInterface», который не может быть найден.

2 голосов
/ 09 февраля 2009

Похоже, ошибка при обработке маркера "+" для вложенных имен ... работает следующее (обман с LINQ):

var nested = typeof(NestedClass).GetInterfaces()
            .SingleOrDefault(i => i.FullName == nestedIfName);

Конечно, в большинстве случаев вы просто используете is или as (или, может быть, IsAssignableFrom) для тестирования интерфейса ... каков здесь вариант использования?

1 голос
/ 09 февраля 2009

Я не правильно прочитал вопрос. Это должно делать то, что вам нужно.

Boolean isSubClass = typeof(NestedClass).GetInterfaces().Contains(typeof(INestedInterface));

Оригинальный ответ:

Я не уверен, является ли это ошибкой или нет, но этот код я использовал для проверки, является ли тип производным от другого типа.

typeof(NestedClass).IsInstanceOfType(typeof(IStandardInterface))

У меня были проблемы при преобразовании его в имена в прошлом. Я думаю, что в целом вы должны остаться с фактическими объектами Type, если можете.

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