كيف يمكنني تجنب وجود مطبوعة مخصصة منفصلة حسب الطلب لكل فصوري؟

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

سؤال

لقد أضفت وظيفة إلى مشروعي الذي يسمح للمستخدمين بإضافة خصائصهم المخصصة الخاصة بهم إلى الكائنات. لقد أنشأت مخصص الخاص بي typedescriptor., PropertyDescriptor. و typedescriptorproviders. الخ .. إلخ .. للقيام بذلك.

ها هي مشكلتي. الآن لدي كل شيء يعمل، لكن كان عليه أن يخلق منفصلا typedescriptionprovider. لكل نوع كائن كائن يمكن أن يكون لديه خصائص مخصصة. إليك ما typedescriptionproviders. يبدو مثل

//type AClass Custom Provider
class AClassTypeProvider : TypeDescriptionProvider
{
    private static TypeDescriptionProvider defaultTypeProvider = TypeDescriptor.GetProvider(typeof(AClass));

    public AClassTypeProvider (): base(defaultTypeProvider)
    {

    }

    public override ICustomTypeDescriptor GetTypeDescriptor(Type objectType, object instance)
    {
        ICustomTypeDescriptor defaultDescriptor = base.GetTypeDescriptor(objectType, instance);

        //returns a custom type descriptor based on a UserPropertyHostType enum value, and the default descriptor
        return new InfCustomTypeDescriptor(UserPropertyHostType.SiteRegion, defaultDescriptor);
    }
}


//type BClass Custom Provider
class BClassTypeProvider : TypeDescriptionProvider
{
    private static TypeDescriptionProvider defaultTypeProvider =   TypeDescriptor.GetProvider(typeof(BClass));

    public BClassTypeProvider (): base(defaultTypeProvider)
    {

    }

    public override ICustomTypeDescriptor GetTypeDescriptor(Type objectType, object instance)
    {
        ICustomTypeDescriptor defaultDescriptor = base.GetTypeDescriptor(objectType, instance);

        //returns a custom type descriptor based on a UserPropertyHostType enum value, and the default descriptor
        return new InfCustomTypeDescriptor(UserPropertyHostType.Building, defaultDescriptor);
    }
}

لذلك كل من مخصص بلدي typedescriptionproviders. مكالمات قاعدة (TypedescriptionProvider Palent) بناء قاعدة من خلال تمريرها الافتراضي typedescriptionprovider. من نوع معين.

ال gettypedescriptor () طريقة المكالمات base.gettypedescriptor () للحصول على الواصف الافتراضي الذي يستخدمه بعد ذلك بواسطة واصف النوع المخصص لإضافة في الخصائص المخصصة.

هل هناك طريقة للجمع بين هذه في مخصص عام واحد typedescriptionprovider. التي لها نفس الوظيفة، ولكنها غير مرتبطة بنوع معين؟ هل يمكنني تخطي توفير الوالد typedescriptionprovider. في المنشئ ولكن في وقت لاحق وضعه في gettypedescriptor () الطريقة عندما أعرف على وجه التحديد ما هو نوع الكائن أو هل هناك طريقة أخرى للحصول على الواصف الافتراضي للنوع الآخر ثم استدعاء base.gettypedescriptor (النوع T، كائن ins) طريقة؟

لا يوجد حل صحيح

نصائح أخرى

يجب أن تفعل هذا الفصل العام ما تريد:

class CustomTypeProvider<T> : TypeDescriptionProvider
{
    private static TypeDescriptionProvider defaultTypeProvider = TypeDescriptor.GetProvider(typeof(T));

    public CustomTypeProvider(): base(defaultTypeProvider)
    {

    }

    public override ICustomTypeDescriptor GetTypeDescriptor(Type objectType, object instance)
    {
        ICustomTypeDescriptor defaultDescriptor = base.GetTypeDescriptor(objectType, instance);

        //returns a custom type descriptor based on a UserPropertyHostType enum value, and the default descriptor
        return new InfCustomTypeDescriptor(UserPropertyHostType.SiteRegion, defaultDescriptor);
    }
}

لقد تعاملت مع هذا في الماضي باستخدام نوع عام:

public class MyTypeDescriptionProvider<T> : TypeDescriptionProvider
{
  public MyTypeDescriptionProvider()
    : base(TypeDescriptor.GetProvider(typeof(T)))
  {
  }
}

أنا متأكد من أنك يمكن أن تتعامل معها بالمثل في نوع غير عام عن طريق تمرير النوع كمعلمة منشئ:

public class MyTypeDescriptionProvider : TypeDescriptionProvider
{
  public MyTypeDescriptionProvider(Type t)
    : base(TypeDescriptor.GetProvider(t))
  {
  }
}

من المحتمل أن يكون ذلك أفضل ما إذا كنت لا تحتاج إلى استخدام النوع داخل المزود - لم يتم اختباره على الرغم من ذلك.

ثم عند استخدام هذا المزود، يتم تسجيل الفصول الدراسية على غرار:

TypeDescriptor.AddProvider(new MyTypeDescriptionProvider<ClassA>(), typeof(ClassA));
TypeDescriptor.AddProvider(new MyTypeDescriptionProvider<ClassB>(), typeof(ClassB));

إلخ.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top