TypedScriptor не возвращает участников из унаследованных интерфейсов

StackOverflow https://stackoverflow.com/questions/4031267

Вопрос

Моя проблема заключается в том, что TypedEscriptor не возвращает участников из унаследованных интерфейсов, это как это должно работать? Или это ошибка?

 [TestFixture]
    public class DescriptorTests
    {
        [Test]
        public void Test()
        {
                                                                    // count = 1 
            Assert.AreEqual(2, TypeDescriptor.GetProperties(typeof(IFoo)).Count);
     // it is going to fail, the Id is not going to be returned
        }

        public interface IEntity
        {
            int Id { get; set; }
        }

        public interface IFoo : IEntity
        {
            string Name { get; set; }
        }
    }
Это было полезно?

Решение

Это не ошибка. От Спецификация CLI ECMA:

8.9.11 Тип интерфейса Вывод

Типы интерфейсов могут потребовать внедрения одного или нескольких других интерфейсов. Любой тип, который реализует поддержку типа интерфейса, также должен реализовывать поддержку для любых необходимых интерфейсов, указанных этим интерфейсом. Это отличается от наследования типа объекта двумя способами:

  • Типы объектов образуют одно дерево наследства; Типы интерфейсов нет.
  • Наследование типа объекта Указывает, как реализации наследуются; Требуемые интерфейсы не делают, поскольку интерфейсы не определяют реализацию. Требуемые интерфейсы Укажите дополнительные договоры, которые поддерживают тип объекта реализации.

Чтобы выделить последнее различие, рассмотрите интерфейс, IFoo, это имеет один метод. Интерфейс, IBar, который получает от него, требуется, что любой тип объекта поддерживает IBar также поддерживает IFooОтказ Это ничего не говорит о том, какие методы IBar Сама будет иметь.

8.10 Участник участника

Только типы объектов могут наследовать реализации, следовательно, только типы объектов могут наследовать элементы (см. § 8.9.8). Несмотря на то, что типы интерфейсов могут быть получены из других типов интерфейсов, они только «наследуют» требование для реализации метода договоров, никогда не областей или реализаций метода.

Редактировать...

Если вы хотите получить свойства интерфейса, в том числе в его предках, то вы можете сделать что-то подобное:

var properties = typeof(IFoo)
                     .GetProperties()
                     .Union(typeof(IFoo)
                                .GetInterfaces()
                                .SelectMany(t => t.GetProperties()));

Другие советы

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top