سؤال

مشكلتي هي أن 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; }
        }
    }
هل كانت مفيدة؟

المحلول

هذا ليس خطأ. من مواصفات ECMA CLI:

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