generische Funktion mit einer Einschränkung "hat Eigenschaft X"?

Ich habe eine Closed-Source-Anwendung eines Drittanbieters, die eine COM-Schnittstelle exportiert, die ich in meiner C # .NET-Anwendung über Interop verwende. Diese COM-Schnittstelle exportiert viele Objekte, die alle als System.Object angezeigt werden, bis ich sie in den entsprechenden Schnittstellentyp umgewandelt habe. Ich möchte allen diesen Objekten eine Eigenschaft zuweisen. Somit:

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

Das Zuweisen der Eigenschaft kann jedoch (aus unvermeidlichen anwendungsspezifischen Gründen) Ausnahmen auslösen, von denen ich eine Wiederherstellung durchführen möchte. Somit:

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...
    }
}

Offensichtlich 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? Meinex Der Wert kann von einem beliebigen Typ sein, daher kann der Compiler ihn nicht auflösen.Attribut. Huhn und Ente befinden sich in keinem Vererbungsbaum und haben keine gemeinsame Schnittstelle.Attribut. Wenn dies der Fall wäre, könnte ich eine Einschränkung für diese Schnittstelle festlegenT. Da es sich jedoch um eine Closed-Source-Klasse handelt, ist dies für mich nicht möglich.

Was ich in meiner Fantasie möchte, ist so etwas wie eine Einschränkung, die das Argument dazu erforderthaben die Eigenschaft .attribute unabhängig davon, ob es eine bestimmte Schnittstelle implementiert. Nämlich,

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

Ich bin mir nicht sicher, was ich von hier aus tun soll, außer diesen kleinen Versuchs- / Fangblock für jedes Huhn, jede Ente, jede Kuh, jedes Schaf und so weiter auszuschneiden / einzufügen.

Meine Frage lautet: Was ist eine gute Problemumgehung für das Problem, eine bestimmte Eigenschaft für ein Objekt aufrufen zu wollen, wenn die Schnittstelle, die diese Eigenschaft implementiert, zur Kompilierungszeit nicht bekannt ist?

Antworten auf die Frage(4)

Ihre Antwort auf die Frage