2009-02-09 5 views
2

Я только что обнаружил очень странное поведение с Type.GetInterface и вложенными типами.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.

  • станда имеет значение TYPEOF (IStandardInterface)
  • вложенные имеют значение нуля

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

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

ответ

4

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

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

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

2

Это выглядит как ошибка обработки в «+» маркер для вложенных имен ... следующее (мошенничество с LINQ) работает:

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

+0

Я преобразовал его в thisType.GetInterfaces(). Содержит (interfaceType), мне нужно, чтобы проверить, возвращает ли фабрика объекты, имеющие определенный интерфейс (поэтому у меня нет экземпляра для использования is/as). – Fionn

1

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

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

Оригинал Ответ:

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

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

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

+0

Мне кажется, что этот метод проверяет, является ли данный экземпляр текущего типа. И если вы используете экземпляр Type как аргумент, он вернет true только для таких вещей, как typeof (Type) .IsInstanceOfType (typeof (IStandardInterface)) – Fionn

Смежные вопросы