Question

J'ai ajouté des fonctionnalités à mon projet qui permet aux utilisateurs d'ajouter leurs propres propriétés personnalisées à des objets. J'ai créé mon propre coutume TypeDescriptor , PropertyDescriptor et TypeDescriptorProviders , etc .. etc .. pour ce faire.

Voici mon problème. En ce moment, je l'ai tout travail, mais a dû créer une directive TypeDescriptionProvider pour chaque type d'objet d'objet qui peut avoir les propriétés personnalisées. Voici ce que mon TypeDescriptionProviders ressembler

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

Alors chacun de mon habitude TypeDescriptionProviders appelle la base (parent TypeDescriptionProvider) constructeur de base en la faisant passer la valeur par défaut TypeDescriptionProvider d'un type spécifique.

GetTypeDescriptor () appels de méthode base.GetTypeDescriptor () pour obtenir le descripteur par défaut qui est ensuite utilisé par mon descripteur de type personnalisé pour ajouter des propriétés personnalisées.

Est-il possible de les combiner en une seule mesure générique TypeDescriptionProvider qui a la même fonctionnalité, mais elle est pas liée à un type spécifique? Puis-je sauter fournir le parent TypeDescriptionProvider dans le constructeur, mais mis plus tard dans la GetTypeDescriptor () méthode quand je sais précisément ce type d'objet est en cours d'interrogation? Ou est-il une autre façon d'obtenir le descripteur par défaut d'un autre type puis en appelant la base.GetTypeDescriptor (type t, ins d'objets) méthode ?

Pas de solution correcte

Autres conseils

Cette classe générique devrait faire ce que vous voulez:

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

Je l'ai traité dans le passé en utilisant un type générique:

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

Je suis assez sûr que vous pouvez le manipuler de la même dans un type non générique en passant le type comme paramètre constructeur:

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

Il est sans doute préférable si vous n'avez pas besoin d'utiliser le type dans le fournisseur -. Ont pas testé si

Ensuite, lorsque vous utilisez ce fournisseur, les classes sont enregistrées le long des lignes de:

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

etc.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top