Ich habe diesen Code, der den Wert aus der Klasse Test erhält und dann in den Typ konvertiert, der es ist. Es wird korrekt als "Int32" gedruckt, aber wenn ich die Gleichheit mit einer anderen Variablen mit demselben Wert teste, wird "false" ausgegeben. Ich vermute, es liegt daran, dass es Referenzgleichheit testet und dass die 2 Variablen wirklich noch Objekte sind. Gibt es eine Möglichkeit, sie zu vergleichen, wenn ich bedenke, dass ich den Typ des zurückgegebenen Werts bis zur Laufzeit nicht kenne (es könnte eine Zeichenfolge, Float, andere Klasse usw. sein)?Wie kann ich die aus Reflection "GetValue" ermittelten Werttypen vergleichen?
class Test{public int y;}
static void Main()
{
var test1 = new Test{y=1};
var test2 = new Test{y=1};
var fields = test1.GetType().GetFields();
var test1Value = fields[0].GetValue(test1);
var test2Value = fields[0].GetValue(test2);
var test1Converted = Convert.ChangeType(test1Value, test1Value.GetType());
var test2Converted = Convert.ChangeType(test2Value, test2Value.GetType());
Console.WriteLine(test1Converted); // prints Int32
Console.WriteLine(test1Converted == test2Converted); // prints false
}
Equals für die Referenz versagen Typen, hier ist es erfolgreich für den Wert/Integer-Typ, wie es der Wert Vergleich tut, erfordert dies explizite überschreiben der Equals-Methode –
@MrinalKamboj Können Sie ein konkretes Beispiel geben, wo ein Referenztyp fehlschlagen würde? Alle Referenztypen * bereits * werden standardmäßig auf Referenzgleichheit gesetzt und nicht mit GetValue umrahmt. –
Wie Sie vorgeschlagen haben, bezieht sich Reference equals auf die Referenzgleichheit. Für die Equals-Standardmethode ist es nicht erforderlich, dass zwei über Reflektion abgerufene Referenztypen auf dieselbe Referenz verweisen. Um den intrinsischen Wert zu vergleichen, müsste die Equals-Methode explizit überschrieben werden für die aktuelle Antwort –