Frage

Wie werde ich wissen, ob eine Objektinstanz eine Eigenschaft oder eine Unter Eigenschaft einer anderen Objektinstanz?

zum Beispiel habe ich diese Klassenstruktur:

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

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

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

Und ich habe nur zwei Instanzen, das Auto und die Supplier; Mit Property in Reflexion, Wie kann ich eine Methode implementieren, wie

bool IsPropertyOrSubPropertyOf(object ObjectInstance, object TargetObejectInstance)

verwendet als

IsPropertyOrSubPropertyOf(SupplierNameInstance, CarInstance)

diese Methode true zurück, wenn die CarInstance der Property Hersteller einen Lieferanten hat, die eine Supplier SupplierNameInstance hat

War es hilfreich?

Lösung

Ist dies tun, was Sie suchen? Sorry, wenn es nicht die sauberste -. Sie werden wahrscheinlich dort auch einige null Kontrollen hinzufügen möchten

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

Edit: Ich habe gerade bemerkt, dass, wenn LookFor IEnumerable ist, dann können Sie mit einem Problem am Ende, wird diese Ihnen überlassen aussortieren;)

Andere Tipps

Sie sollten nicht Reflexion für das jeweilige Beispiel zu verwenden, müssen Sie beschreiben:

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

(By the way, verpassten Sie den Namen der List<Supplier> Eigenschaft in Ihrer Manufacturer Klasse aus. Ich nehme an habe, dass es tatsächlich Suppliers in meinem obigen Code genannt wird.)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top