Вы получаете ошибку компилятора, а не ошибку времени выполнения.Поэтому try-catch
не поможет.Проблема возникает из-за того, что класс ChildB
находится в другом пространстве имен.Добавьте
using The.Other.Namespace;
… вверху вашего кода или, альтернативно, напишите
(The.Other.Namespace.ChildB)myObject
(Это полезно, если есть конфликт имен).
Примечание: ошибка компилятора возникает в результате статического анализа вашего кода.C # может обнаруживать синтаксические ошибки и очевидные логические ошибки, такие как использование несовместимых типов, использование неизвестных идентификаторов, неназначенных переменных и т. Д. В то время как во время выполнения вы можете получить исключения в зависимости от фактических значений, таких как: null-reference-exception, index-out-of-of-исключение границ, исключение деления на ноль и многое другое.
Имя класса можно получить с помощью myObject.GetType().Name
.Кроме того, вместо использования "ChildA"
было бы безопаснее написать nameof(ChildA)
, потому что тогда компилятор C # проверяет, чтобы имя было существующим именем, а переименовывающий рефакторинг будет учитывать это выражение.
Еще лучше: начиная с C # 7.0, вы можете использовать сопоставление с образцом в операторе switch:
switch (myObject)
{
case ChildA childA:
GUILayout.Label(childA.sprite.texture);
break;
case ChildB childB:
GUILayout.Label(childB.animated[0].texture);
case ChildC childC:
GUILayout.Label(childC.default.texture);
break;
}
Гораздо лучше: реализовать базовое свойство только для абстрактного метода получения LabelTexture
и переопределить егов производных классах и пусть он возвращает соответствующую текстуру.Тогда вы можете просто получить текстуру с помощью myObject.LabelTexture
(я не знаю, какой тип вы используете для texture
, поэтому Image
- это всего лишь предположение):
public abstract class BaseClass
{
public abstract Image LabelTexture { get; }
// ... other stuff
}
public class ClassA : BaseClass
{
public override Image LabelTexture => sprite.texture;
}
public class ClassB : BaseClass
{
public override Image LabelTexture => animated[0].texture;
}
public class ClassC : BaseClass
{
public override Image LabelTexture => default.texture;
}
public override Image LabelTexture => sprite.texture;
- этопросто более короткий синтаксис для public override Image LabelTexture { get { return sprite.texture; } }
Тогда получение правильной текстуры становится простым:
public void MethodName(BaseClass myObject)
{
GUILayout.Label(myObject.LabelTexture);
}
Это называется Полиморфизм (Руководство по программированию в C #)