generische Funktion mit einem "hat die Eigenschaft X" - Einschränkung?

Habe ich eine third-party-closed-source-Anwendung, die Exporte eine COM-Schnittstelle, die ich verwende in meinem C#.NET Anwendung über Interop. Diese COM-Schnittstelle exportiert viele Objekte, die alle zeigen, wie System.Objekt, bis ich warf Sie auf den entsprechenden interface-Typ. Ich möchte das zuweisen einer Eigenschaft aller dieser Objekte. Also:

foreach (object x in BigComInterface.Chickens)
{
    (x as Chicken).attribute = value;
}
foreach (object x in BigComInterface.Ducks)
{
    (x as Duck).attribute = value;
}

Aber die Zuordnung der Eigenschaft ist wahrscheinlich (für Anwendungs-spezifische Gründe, die unvermeidlich sind) zu werfen Ausnahmen, von denen ich möchte, sich zu erholen, so dass ich wirklich wollen eine try/catch um jeden. Also:

foreach (object x in BigComInterface.Chickens)
{
    try
    {
        (x as Chicken).attribute = value;
    }
    catch (Exception ex)
    {
        //handle...
    }
}
foreach (object x in BigComInterface.Ducks)
{
    try
    {
        (x as Duck).attribute = value;
    }
    catch (Exception ex)
    {
        //handle...
    }
}

Natürlich wäre es so viel sauberer, dies zu tun:

foreach (object x in BigComInterface.Chickens)
{
    SetAttribute<Chicken>(x as Chicken, value);
}
foreach (object x in BigComInterface.Ducks)
{
    SetAttribute<Duck>(x as Duck, value);
}

void SetAttribute<T>(T x, System.Object value)
{
    try
    {
        x.attribute = value;
    }
    catch
    {
        //handle...
    }
}

Sehen Sie das problem? Meine x Wert kann einen beliebigen Typ haben, damit der compiler nicht auflösen kann .Attribut. Huhn und Ente sind nicht in jeder Art von Vererbung Baum und Sie nicht teilen eine Schnittstelle, die hat .Attribut. Wenn Sie es Taten, ich könnte eine Einschränkung für die Schnittstelle auf T. Aber da die Klasse "closed-source", das ist für mich nicht möglich.

Was ich will, in meiner Phantasie, ist so etwas wie eine Einschränkung erfordern das argument haben .Attribut-Eigenschaft unabhängig davon, ob es eine bestimmte Schnittstelle implementiert. Zu Witz,

void SetAttribute<T>(T x, System.Object value) where T:hasproperty(attribute)

Ich bin nicht sicher was zu tun hier andere als Ausschneiden/einfügen dieses kleine try/catch-block für jedes Huhn, Ente, Kuh, Schaf, und so weiter.

Meine Frage ist: Was ist eine gute Abhilfe für dieses problem wollen, rufen Sie eine bestimmte Eigenschaft auf ein Objekt, wenn die Schnittstelle, die implementiert, dass die Eigenschaft nicht zum Zeitpunkt der Kompilierung bekannt?

InformationsquelleAutor catfood | 2009-08-20
Schreibe einen Kommentar