Pregunta

He añadido la funcionalidad de mi proyecto que permite a los usuarios añadir sus propias propiedades personalizadas a los objetos. He creado mi propio personalizado TypeDescriptor , PropertyDescriptor y TypeDescriptorProviders etc .. etc .. para hacer esto.

Esta es mi problema. En este momento tengo todo de trabajo, pero tuvo que crear una separada TypeDescriptionProvider para cada objeto de tipo de objeto que puede tener las propiedades personalizadas. Esto es lo que mi TypeDescriptionProviders parecerse

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

Así que cada uno de mi costumbre TypeDescriptionProviders llama a la base (TypeDescriptionProvider padre) constructor base pasándolo por defecto TypeDescriptionProvider de un tipo específico.

La GetTypeDescriptor () llamadas a métodos base.GetTypeDescriptor () para obtener el descriptor por defecto que se utiliza luego por mi descriptor de tipo personalizado para añadir en las propiedades personalizadas.

¿Hay alguna manera de combinar estos en un solo encargo genérico TypeDescriptionProvider que tiene la misma funcionalidad, pero no está ligado a un tipo específico? ¿Puedo omitir proporcionar a los padres TypeDescriptionProvider en el constructor, pero luego ponerlo en el Método GetTypeDescriptor () cuando sé específicamente qué tipo de objeto se consulta? ¿O hay alguna otra manera de conseguir el descriptor por defecto de un tipo distinto a continuación, llamar a la base.GetTypeDescriptor (tipo T, complementos de objeto) método?

No hay solución correcta

Otros consejos

Esta clase genérica debe hacer lo que quiera:

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

He manejado esto en el pasado mediante el uso de un tipo genérico:

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

Estoy bastante seguro de que podría manejar la situación de manera similar en un tipo no genérico pasando el tipo como un parámetro de constructor:

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

Este es probablemente preferible que no es necesario utilizar el tipo dentro del proveedor -. No lo he probado, aunque

A continuación, cuando se utiliza este proveedor, las clases se registraron a lo largo de las líneas de:

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

etc.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top