Wie Sie auf suchen, wenn ein Objekt über eine Eigenschaft mit einem Wert von C#
Ich würde gerne eine Funktion erstellen, wo ich kann in ein beliebiges Objekt und überprüfen, um zu sehen, ob es eine bestimmte Eigenschaft mit einem bestimmten Wert. Im Versuch, dies zu tun mit Reflexion, aber die Reflexion immer noch verwirrt mich ein wenig. Ich hatte gehofft, dass jemand vielleicht in der Lage sein zu zeigen Sie mich in die richtige Richtung.
hier ist der code, den ich versuche, aber offensichtlich das es nicht funktioniert:
public static bool PropertyHasValue(object obj, string propertyName, string propertyValue)
{
try
{
if(obj.GetType().GetProperty(propertyName,BindingFlags.Instance).GetValue(obj, null).ToString() == propertyValue)
{
Debug.Log (obj.GetType().FullName + "Has the Value" + propertyValue);
return true;
}
Debug.Log ("No property with this value");
return false;
}
catch
{
Debug.Log ("This object doesnt have this property");
return false;
}
}
- Was "funktioniert nicht"? Sind Sie immer Fehler?
- Wenn ich den pass in ein Objekt, das ich kenne, hat sowohl die Eigenschaft und den Wert, es gibt meiner Debug.Log in der catch-Anweisung, egal was.
- Anstatt nur Druck aus, dass es ein Fehler war, Sie sollte eigentlich fangen die spezifischen execption und protokollieren Sie die details der Ausnahme, so dass Sie wissen, was falsch gelaufen ist (oder besser noch, nicht die Ausnahme abfangen, wenn Sie nicht richtig damit umgehen).
- Es stellt sich heraus, dass ich fehlte eine verbindliche Flagge, ich warte auf die ersten 7 Minuten sein, damit ich das akzeptieren kann, die richtige Antwort. Vielen Dank An Alle!
- Nur ein FYI, wenn Sie versuchen zu finden, nicht-öffentlichen Eigenschaften für eine sichere Laufzeitumgebung (z.B. Silverlight), den Sie nicht bekommen keine. Auch mit der Reflexion, die Silverlight-runtime verhindert, dass Sie von grabbing non-public-Mitglieder.
- Nur so nebenbei - finden Sie in dieser MSDN-Seite über wie fangen bestimmte exception-Typen in einer Weise, die Sie, um zu sehen, eine Fehlermeldung - es scheint Sie nicht vertraut sind mit diesem Konzept. msdn.microsoft.com/en-us/library/0yd65esw(v=vs. 100).aspx
- Intead fangen alle Arten von Ausnahmen, die Sie möglicherweise verwenden möchten
GetProperties
und Suche in der Ausgabe zu sehen, ob es mit dem gewünschten Namen. Sie könnte verwenden von Linq für die. - Oder noch besser: fahren Sie mit
GetProperty
, aber überprüfen, ob seine Ausgabe istnull
(die Eigenschaft wurde nicht gefunden) oder einePropertyInfo
Instanz. - In diesem Fall habe ich nicht die Sorge um die Ausnahme, ich wusste, dass wenn ich erhielt eine null-Verweis-Ausnahme, das war, weil das Objekt nicht über diese Eigenschaft. Die try-Anweisung ist nur ein Versuch, ignorieren Sie es einfach, wenn das passiert und bewegen sich mit seinem Leben. Ich meistens halten Sie es in meinem Beispiel in einem Versuch, Ihnen zu zeigen, Jungs, was war in meinem Kopf, während ich dies Schreibe.
- Ich mag die Idee, werde ich testen, dass statt meiner try-catch.
- abfangen von Ausnahmen ist nicht die richtige Art zu tun, flow control. Es ist unglaublich langsam. Siehe hierzu: msdn.microsoft.com/en-us/library/seyhszts(v=vs. 100).aspx
Du musst angemeldet sein, um einen Kommentar abzugeben.
Werden Sie angeben möchten mehr
BindingFlags
imType.GetProperty
Methode aufrufen. Sie tun das mit einer|
Charakter und die anderen Flaggen, wieBindingFlags.Public
. Andere Probleme sind nicht null -obj
parameter oder null-Ergebnis aus IhrePropertyInfo.GetValue
nennen.Deutlicher in Ihrer Methode, Sie schreiben, könnte es wie diese und Zusammenbruch nach unten, wo Sie sehen, passen.
Meiner Meinung nach sollte man akzeptieren
propertyValue
alsobject
und vergleichen Sie die Objekte so, aber das würde zeigen ein anderes Verhalten als Ihre ursprünglichen Probe.Seine zu spät, um diese Frage zu beantworten hier. Aber ich war auf der Suche für das gleiche problem und löste es in eine sauberere Möglichkeit mit
LINQ
undReflection
. Also, wenn Sie sind offen zuLINQ
. Sie können es bekommen wie diese.Code überprüfen Sie, ob das Eigentum von dir-Objekt Enthält die
Value_to_be_compared
Wenn Sie wollen, um exakt den Wert, dann können Sie gehen für:
Beim abrufen der Mitglieder, zusätzlich zur Angabe des instance/static, die Sie angeben müssen Öffentliche/nicht Öffentliche:
Beispielsweise zum abrufen von öffentlichen Eigenschaften, die Sie verwenden würden:
Abrufen alle Eigenschaften, die Sie müssen ermittelt werden Öffentliche und nicht-Öffentliche.
Sollten Sie einen Blick auf msdn und informieren Sie sich über die Bindung flags. Im speziellen:
Müssen Sie angeben, Instanz-oder Statische sowie Öffentliche oder nicht-Öffentliche oder nicht-Mitglieder zurückgegeben werden.