Mam ten kod, który pobiera wartość z klasy Test, a następnie konwertuje ją na typ. Drukuje poprawnie jako "Int32", ale kiedy testuję równość z inną zmienną o tej samej wartości, wypisuje "false". Podejrzewam, że tak jest, ponieważ testuje równanie odniesienia i że dwie zmienne są naprawdę obiektami. Czy istnieje sposób ich porównania, pamiętając, że nie będę znać typu wartości zwracanej do czasu wykonania (może to być ciąg, zmienna, inna klasa itp.)?Jak mogę porównać typy wartości nabyte z "GetValue" Reflection?
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 zawiedzie na odniesienie type, tutaj jest to udane dla typu wartość/liczba całkowita, ponieważ porównuje wartość, to wymaga jawnego przesłonięcia metody Equals. –
@MinalBamboj Czy możesz podać konkretny przykład, w którym typ odniesienia zakończyłby się niepowodzeniem? Wszystkie typy referencyjne * już * domyślnie odwołują się do równości i nie będą zapakowane w 'GetValue'. –
Zgodnie z sugestią, Odniesienie równe odnosi się do równości odniesienia, dla domyślnej metody Równania, więc nie jest konieczne, aby dwie pobrane zmienne referencyjne zmienne poprzez odbicie wskazywałyby na to samo odniesienie, wymagałoby to jawnego przesłonięcia metody Równań w celu porównania wartości wewnętrznej dla bieżącej odpowiedzi –