Pregunta

¿Cómo sabré si una instancia de objeto es una propiedad o una subpropiedad de otra instancia de objeto?

por ejemplo, tengo esta estructura de clase:

public class Car
{
      public Manufacturer Manufacturer {get;set;}
}

public class Manufacturer
{
      public List<Supplier> {get;set;}
}

public class Supplier
{
      string SupplierName {get;set;}
}

Y solo tengo dos instancias, Car y SupplierName; Usando PropertyInfo en Reflection, ¿cómo puedo implementar un método como

?
bool IsPropertyOrSubPropertyOf(object ObjectInstance, object TargetObejectInstance)

usado como

IsPropertyOrSubPropertyOf(SupplierNameInstance, CarInstance)

este método devolverá verdadero si el fabricante de la propiedad de CarInstance tiene un proveedor que tiene un SupplierName SupplierNameInstance

¿Fue útil?

Solución

¿Esto hace lo que buscas? Lo sentimos, si no es el más limpio, es probable que también desee agregar algunos cheques nulos allí.

private bool IsPropertyOrSubPropertyOf(Object Owner, Object LookFor)
{

    if (Owner.Equals(LookFor))
    {
        // is it a property if they are the same?
        // may need a enum rather than bool
        return true;
    }

    PropertyInfo[] Properties = Owner.GetType().GetProperties();

    foreach (PropertyInfo pInfo in Properties)
    {
        var Value = pInfo.GetValue(Owner, null);

        if (typeof(IEnumerable).IsAssignableFrom(Value.GetType()))
        {
            // Becomes more complicated if it can be a collection of collections
            foreach (Object O in (IEnumerable)Value)
            {
                if (IsPropertyOrSubPropertyOf(O, LookFor))
                    return true;
            }
        }
        else
        {
            if (IsPropertyOrSubPropertyOf(Value, LookFor))
            {
                return true;
            }
        }

    }
    return false;
}

Editar: acabo de notar que si LookFor es IEnumerable entonces puede terminar con un problema, se lo dejará a usted para que lo resuelva;)

Otros consejos

No debería necesitar usar la reflexión para el ejemplo particular que describe:

bool IsPropertyOrSubPropertyOf(Supplier supplierInstance, Car carInstance)
{
    return carInstance.Manufacturer.Suppliers.Contains(supplierInstance);
}

(Por cierto, se perdió el nombre de la propiedad List<Supplier> en su clase Manufacturer. Supuse que en realidad se llama Suppliers en mi código anterior.)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top