Wie werde ich tun unten eine Eigenschaft bohren?
-
05-07-2019 - |
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
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.)