¿Función genérica con una restricción "tiene propiedad X"?

Tengo una aplicación de código cerrado de terceros que exporta una interfaz COM, que estoy usando en mi aplicación C # .NET a través de Interop. Esta interfaz COM exporta muchos objetos que se muestran todos como System.Object hasta que los emito al tipo de interfaz apropiado. Quiero asignar una propiedad de todos estos objetos. Así:

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

Pero la asignación de la propiedad es probable (por razones específicas de la aplicación que son inevitables) lanzar Excepciones de las que quiero recuperar, por lo que realmente quiero probar / atrapar a cada una. Así:

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

Obviamente, sería mucho más limpio hacer esto:

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

¿Ves el problema? Mix El valor puede ser de cualquier tipo, por lo que el compilador no puede resolver.atributo. Chicken y Duck no están en ningún tipo de árbol de herencia y no comparten una interfaz que tenga.atributo. Si lo hicieran, podría poner una restricción para esa interfaz enT. Pero como la clase es de código cerrado, eso no es posible para mí.

Lo que quiero, en mi fantasía, es algo así como una restricción que requiere el argumento paratener la propiedad .attribute independientemente de si implementa una interfaz determinada. Esto es,

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

No estoy seguro de qué hacer aquí, aparte de cortar / pegar este pequeño bloque de prueba / captura para cada pollo, pato, vaca, oveja, etc.

Mi pregunta es: ¿cuál es una buena solución para este problema de querer invocar una propiedad específica en un objeto cuando la interfaz que implementa esa propiedad no se puede conocer en el momento de la compilación?

Respuestas a la pregunta(4)

Su respuesta a la pregunta