es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Obtener una instancia de un campo por tipo de interfaz?

Tengo una interfaz:

“`C#
public interface IThings<t> where T : class
{
public void Play();
}

<pre><code><br />que popula una instancia de clase con varios campos que pueden agregarse a medida que el proyecto avanza (por lo que no se utilizan declaraciones switch).

<strong>Estoy intentando llamar al método de interfaz Play de un campo basado en su tipo de interfaz, pero no tengo acceso a ningún campo en particular.</strong>

“`C#
public class MyClass
{
public IThings<widget> Widgets;
public IThings<fidget> Fidgets;
public IThings<gizmo> Gizmos;
public IThings<doodad> DooDads;

public void DoWork<t>() where T : IThings<clase>
{
T.Play(); //no compila, por supuesto.
}
}

He intentado experimentar con reflexión, pero no soy muy competente en eso y no estoy seguro de cómo obtener la instancia. También me gustaría evitar depender de la convención de nombres de campo a nombres de clase. Seguro que sería más fácil, pero podría ser una fuente potencial de errores.

C#
var fieldName = typeof(MyClass).GetRuntimeFields()
.Where(t => t.FieldType == typeof(IThings<t>))
.FirstOrDefault().Name;

El código anterior obtiene el nombre del campo que estoy buscando. Solo necesito poder llamar al método en ese campo.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Como estás tratando de llamar al método “Play” en un campo basado en su tipo de interfaz, puedes hacer uso de la palabra clave “dynamic” en C#. Puedes modificar el método “DoWork” de la siguiente manera:

    C#
    public void DoWork<t>() where T : class, IThings<object>
    {
    dynamic field = this.GetType().GetFields().FirstOrDefault(f => f.FieldType == typeof(T)).GetValue(this);
    field.Play();
    }

    Aquí, utilizamos la reflexión para obtener el campo del tipo especificado (T) desde la instancia actual (this). Luego, utilizamos la palabra clave “dynamic” para permitir la unión en tiempo de ejecución del método “Play” basado en el tipo de interfaz. Finalmente, simplemente llamamos al método “Play” en el objeto “field”.

    Ten en cuenta que hemos agregado una restricción en T para que implemente la interfaz IThings<object>. Esto se debe a que la palabra clave “dynamic” requiere una referencia de objeto, y no se puede usar un parámetro de tipo genérico como argumento de tipo para un tipo “dynamic”.

Comments are closed.