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.

Dinámicamente convirtiendo objetos desde FieldInfo.GetValue en c#

Estoy intentando iterar a través de todos los campos en una instancia de una clase y extraer su nombre/datos. Los campos en sí son instancias de clases personalizadas para almacenar datos con algunas características específicas que necesitaba. Lo siguiente funciona:

foreach (var v in typeof(CentralParams).GetFields())
{
    if(v.GetValue(_centralParams).GetType() == typeof(BoolEventProperty))
    {
        BoolEventProperty prop = (BoolEventProperty) v.GetValue(_centralParams);
        print(v.Name + "   " + prop.Value);
    }

    if(v.GetValue(_centralParams).GetType() == typeof(FloatEventProperty))
    {
        FloatEventProperty prop = (FloatEventProperty) v.GetValue(_centralParams);
        print(v.Name + "   " + prop.Value);
    }

    if(v.GetValue(_centralParams).GetType() == typeof(IntEventProperty))
    {
       IntEventProperty prop = (IntEventProperty) v.GetValue(_centralParams);
       print(v.Name + "   " + prop.Value);
    }
}

Sin embargo, tengo que comprobar manualmente el tipo del objeto en el campo, luego convertirlo en una nueva instancia de ese tipo para acceder al miembro Value. Esto es molesto ya que cada vez que agregue un nuevo tipo de datos a la clase CentralParams tendré que manejarlo explícitamente aquí.

¿Hay alguna manera de que pueda convertirlo dinámicamente en una variable vacía del tipo correcto?

v.GetValue(_centralParams).GetType() devuelve el tipo que necesito, por lo que parece que debería ser posible. Algo así como:

var type = v.GetValue(_centralParams).GetType();
var prop = (type)v.GetValue(_centralParams);

Gracias.

Tags:  ,

Answer

  1. Avatar for davy.ai

    Sí, puede usar la API de reflexión de C# para convertir dinámicamente un objeto al tipo correcto. En su caso, puede utilizar el método Activator.CreateInstance para crear una nueva instancia del tipo de propiedad, y luego usar el método SetValue para establecer el valor de la propiedad en la nueva instancia creada. Así es como puede modificar su código:

    foreach (var v in typeof(CentralParams).GetFields())
    {
    
        var propType = v.GetValue(_centralParams).GetType();
        var propValue = Activator.CreateInstance(propType);
    
        v.SetValue(_centralParams, propValue);
        print(v.Name + "   " + propValue.GetType().GetProperty("Value").GetValue(propValue));
    
    }
    

    En este código, primero obtenemos el tipo de propiedad usando GetType como antes. Luego creamos una nueva instancia del tipo de propiedad usando Activator.CreateInstance y la almacenamos en la variable propValue. Luego establecemos el valor de la propiedad en la nueva instancia creada usando el método SetValue. Finalmente, recuperamos el valor de la propiedad Value de la nueva instancia creada e imprimimos junto con el nombre del campo.

    Este enfoque le permite convertir dinámicamente la propiedad y acceder a su miembro Value sin tener que manejar cada tipo de datos de forma explícita.

Comments are closed.