У меня есть базовый класс и несколько его подклассов.
У меня есть объект базового класса, и я знаю, что раньше он был экземпляром одного из подклассов, но был приведен к базовому классу.
Я хочу знать, как узнать, какой подкласс был раньше. Более конкретно:
SubClass sc = new SubClass();
BaseClass bc = sc;
if (bs was SubClass) print("bc was SubClass");
Как мне написать это if правильно? Возможно ли это вообще?





Оператор
isпроверяет, совместим ли результат выражения с заданным типом.
SubClass sc = new SubClass();
BaseClass bc = sc;
if (bc is SubClass)
Console.WriteLine("bc is a Subclass");
это только проверка, можно ли bc привести к Subclass (подкласс является одним из родительских типов). Хотя я все еще вижу, что слово -а все еще актуально.
Но, как упоминалось в @Enigmativity, если вы спросите о создании типа источника, будет точнее.
if (bc.GetType() == typeof(SubClass))
Console.WriteLine("bc created from Subclass");
Я вижу, у вас есть список базовых классов, и вы хотите выбрать объект по его типу... предположим, что следующие классы
public class Organism { public string? Name; }
public class Person : Organism { }
public class Animal : Organism { }
public class Cat : Animal { }
public class Dog : Animal { }
public class Horse : Animal { }
и у вас есть список Organism
List<Organism> organisms = [
new Person{Name = "ibram"},
new Cat(){Name = "memo"},
new Horse{Name = "flash"}
];
изучите следующие запросы
organisms.Where(organism => organism is Animal); // will return [Cat(memo), Horse(flash)]
organisms.Where(organism => organism.GetType() == typeof(Animal)); // return empty [] there is no object in list created from animal
organisms.Where(organism => organism.GetType() == typeof(Cat)); // will return [Cat(memo)]
organisms.Where(organism => organism is Person); // will return [Person(ibram)]
Это не «обнаруживает, какой подкласс был раньше», просто его можно привести к заданному типу.
@Enigmativity спасибо за сотрудничество для большей ясности... вы совершенно правы
Вы можете использовать оператор is вместо «was» в операторе if:
Он проверяет, совместим ли объект с заданным типом, и возвращает true, если объект совместим; в противном случае возвращает false.
Кроме того, вместо «печатать» необходимо написать Console.WriteLine().
Это не «обнаруживает, какой подкласс был раньше», просто его можно привести к заданному типу.
Использование is НЕ РАБОТАЕТ.
Он не «обнаруживает, каким подклассом он был раньше», просто его можно привести к заданному типу.
Возьмите эти определения классов:
public class BaseClass { }
public class IntermediateClass : BaseClass { }
public class SubClass : IntermediateClass { }
Я могу написать этот код, и он будет НЕПРАВИЛЬНЫМ:
SubClass sc = new SubClass();
BaseClass bc = sc;
if (bc is IntermediateClass)
{
Console.WriteLine("bc is IntermediateClass");
}
Мне это говорит bc is IntermediateClass, но это не так. Это BaseClass.
Единственный способ сделать это — прямое сравнение на равенство.
Это работает:
if (bc.GetType() == typeof(SubClass))
{
Console.WriteLine("bc is Subclass");
}
@Daniel, если он возвращает значение null, то это означает, что в списке нет объекта, экземпляр которого создается из типа T
@Daniel - Какой тип T? Если это универсальный тип, вы явно указываете его при вызове? Вам нужно будет показать мне полный код, который вы пытаетесь использовать. Все, что я публикую, было проверено перед публикацией. Я знаю, что мой код работает.
@Daniel, пожалуйста, не удаляй комментарии. Они обеспечивают контекст для комментариев.
Принятый вами ответ подходит не для всех случаев.