Como posso evitar ter um Provedor de TypeDescriptor personalizado separado para cada uma das minhas aulas?
-
19-09-2019 - |
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.