Речь идет не о получении базового типа. Это примерно то, что считается "равным".
В .NET каждый тип наследуется от object
и, следовательно, наследует Object.Equals()
. Но для ссылочных типов Object.Equals()
будет сравнивать только, являются ли два объекта точно таким же объектом , а не равны ли их содержания.
Например, new List<string>() == new List<string>()
всегда будет false
.
Вот почему firstExample == secondExample
и firstExampleValue.Equals(secondExampleValue)
всегда будут false
.
Однако классы могут переопределять метод Equals
. Например, String
переопределяет Equals()
, чтобы сравнивать содержимое обоих.
В этом случае, если ExampleClass
является классом, которым вы управляете, вы можете переопределить Equals
и сказать ему сравнивать содержимое каждого свойства (и содержимое каждого List
), чтобы решить, являются ли они равны. Как только вы это сделаете, вы можете просто написать firstExample == secondExample
, и это будет true
.
Документация Object.Equals()
на самом деле имеет простой пример этого: https://docs.microsoft.com/en-us/dotnet/api/system.object.equals
Обновление: Приведение к базовому типу не дает вам никаких преимуществ. Даже если тип приведен к object
, он все равно использует Equals
из базового типа при сравнении. Например, это приводит к true
: ((object)"hello") == ((object)"hello")
, потому что он использует String.Equals
, а не Object.Equals
.
Итак, ваша настоящая проблема в том, чтобы знать, переопределен ли тип Equals
. Вы можете проверить, переопределен ли тип Equals
, например:
var type = typeof(string);
var overriddenEquals = type.GetMember("Equals").First().DeclaringType != typeof(object);
Но это все равно не поможет вам для типов, которые не переопределяют равно. Как вы их сравниваете?
Единственный способ сделать это - знать типы, которые будут использоваться, и тестировать их специально (набор if
операторов) и решать, как вы будете их сравнивать. (для списков вы можете проверить на is IEnumerable
, пройтись по нему, а затем проверить тип внутри списка)
И в этих случаях не имеет значения, реализует ли тип IConvertible
, поскольку вы будете знать, что это за тип, и можете привести его непосредственно к нему, например:
if (obj is Subnets objSubnets) {
//compare objSubnets to another Subnets object
}