Wie kann ich vermeiden, für jede meiner Klassen einen separaten benutzerdefinierten Typedescriptionprovider mit?

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

Frage

Ich habe eine erweiterte Funktionalität mein Projekt, das erlaubt den Benutzern, ihre eigenen Eigenschaften, um Objekte hinzuzufügen. Ich habe meine eigene benutzerdefinierte erstellt TypeDescriptor , PropertyDescriptor und TypeDescriptorProviders etc .. etc .. dies zu tun.

Hier ist mein Problem. Im Moment habe ich sie alle arbeiten, hatte aber einen separaten Typedescriptionprovider für jedes Objekt Objekttyp zu erstellen, die die benutzerdefinierten Eigenschaften haben können. Hier ist, was meine TypeDescriptionProviders aussehen

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

So jede meiner benutzerdefinierten TypeDescriptionProviders ruft die Basis (Typedescriptionprovider parent) Basiskonstruktor durch die Standard vorbei Typedescriptionprovider eines bestimmten Typs.

GetTypeDescriptor () Methodenaufrufe base.GetTypeDescriptor () den Standard-Descriptor zu erhalten, die dann durch meinen benutzerdefinierten Typdeskriptor verwendet wird, auf den benutzerdefinierten Eigenschaften hinzuzufügen.

Gibt es eine Möglichkeit, diese in einem einzigen generischen Brauch zu kombinieren Typedescriptionprovider , die die gleiche Funktionalität hat, ist aber nicht auf einen bestimmten Typ gebunden? Kann ich die übergeordneten überspringen Bereitstellung von Typedescriptionprovider im Konstruktor aber später in der gesetzt GetTypeDescriptor () Methode, wenn ich speziell weiß Art von Objekt, was abgefragt wird? Oder gibt es eine andere Möglichkeit, die Standardbeschreibung einer Art des Erhaltens andere dann ruft die base.GetTypeDescriptor (Typ t, Objekt in) Methode?

Keine korrekte Lösung

Andere Tipps

Diese allgemeine Klasse sollte das tun, was Sie wollen:

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

Ich habe dies in der Vergangenheit gehandhabt durch einen generischen Typen mit:

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

Ich bin ziemlich sicher, könnten Sie damit umgehen in ähnliche Weise in einem nicht-generischen Typ durch den Typen als Konstruktor Parameter übergeben:

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

Dies ist wahrscheinlich vorzuziehen, wenn Sie den Typ innerhalb der Provider nicht verwenden müssen -. Nicht getestet es aber

Dann, wenn dieser Anbieter verwenden, werden Klassen entlang der Linien eingetragen:

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

etc.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top