Как я могу избежать использования отдельного пользовательского TypeDescriptorProvider для каждого из моих классов?

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

Вопрос

Я добавил в свой проект функциональность, которая позволяет пользователям добавлять свои собственные свойства к объектам.Я создал свой собственный обычай Типоискатель, ПропертиДескриптор и Поставщики типовых описаний и т.д..и т.д..чтобы сделать это.

Вот в чем моя проблема.Прямо сейчас у меня все это работает, но пришлось создать отдельный Поставщик типовых описаний для каждого объекта тип объекта, который может иметь пользовательские свойства.Вот что мой Поставщики типовых описаний выглядеть как

//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);
    }
}

Итак, каждый из моих обычаев Поставщики типовых описаний называет базовый (родительский параметр TypeDescriptionProvider) базовый конструктор, передав ему значение по умолчанию Поставщик типовых описаний определенного типа.

Тот самый GetTypeDescriptor() вызовы метода База.GetTypeDescriptor() чтобы получить дескриптор по умолчанию, который затем используется моим пользовательским дескриптором типа для добавления пользовательских свойств.

Есть ли какой-то способ объединить их в единый общий обычай Поставщик типовых описаний который обладает той же функциональностью, но не привязан к определенному типу?Могу ли я пропустить предоставление родительского Поставщик типовых описаний в конструкторе, но позже установите его в GetTypeDescriptor() метод, когда я конкретно знаю, какой тип объекта запрашивается?Или есть какой-то другой способ получить дескриптор типа по умолчанию, отличный от вызова База.GetTypeDescriptor(тип t, object 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