Pergunta

Eu adicionei funcionalidade para o meu projeto que permite que os usuários adicionem suas próprias propriedades personalizadas a objetos. Eu criei meu próprio costume TypeDescriptor , PropertyDescriptor e TypeDescriptorProviders etc .. etc .. para fazer isso.

Aqui está o meu problema. Agora eu tenho tudo funcionando, mas teve que criar um separar TypeDescriptionProvider para cada tipo de objeto objeto que pode ter as propriedades personalizadas. Aqui está o que a minha TypeDescriptionProviders olhar como

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

Assim, cada um de meu costume TypeDescriptionProviders chama o base (TypeDescriptionProvider pai) construtor base, passando-o padrão TypeDescriptionProvider de um tipo específico.

GetTypeDescriptor () chamadas de método base.GetTypeDescriptor () para obter o descritor default que é então utilizado pelo meu descritor de tipo personalizado para adicionar as propriedades personalizadas.

Existe alguma maneira de combiná-las em uma única costume genérico TypeDescriptionProvider que tem a mesma funcionalidade, mas não está vinculado a um tipo específico? Posso pular fornecendo o pai TypeDescriptionProvider no construtor, mas depois colocaram no GetTypeDescriptor () método quando eu sei especificamente o tipo de objeto está sendo consultado? Ou há alguma outra forma de obter o descritor default de um tipo diferente, em seguida, chamar o base.GetTypeDescriptor (Type t, ins objeto) método?

Nenhuma solução correta

Outras dicas

Esta classe genérica deve fazer o que quiser:

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

Tenho tratado isso no passado, usando um tipo genérico:

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

Estou bastante certeza de que poderia lidar com isso de forma semelhante em um tipo não-genérico, passando o tipo como um parâmetro de construtor:

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

Este é provavelmente preferível se você não precisa usar o tipo de dentro do provedor -. Não testei embora

Em seguida, ao usar este provedor, as aulas são registradas ao longo das linhas de:

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

etc.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top