Приведение к типу из переменной типа - PullRequest
0 голосов
/ 20 февраля 2019

Я использую Unity.У меня есть

abstract class A {}
class A1 : A {object someField;}
class A2 : A {object someField;}

У меня есть CustomEditor, где я создаю экземпляры A1 / A2 с отражением (мне нужна возможность добавлять новые классы, производные от A), но есть проблема: если я использую Activator как

Type chosenType = ChooseType(); //ChosenType can be A1 or A2
A newObj = (A)Activator.CreateInstance(chosenType)

Unity не сериализует эти объекты (потому что он сериализует объекты как (A), но не как (A1) или (A2)), которые я хочу разыграть как

(chosenType)MyObj

1 Ответ

0 голосов
/ 20 февраля 2019

Лучший способ, которым я видел динамическое приведение типов таким образом, - это создание универсального типа, подобного

public static class ReflectionHelper{

    public T CastTo<T>(object obj)
    {
        return (T) obj;
    }
}

А затем во время выполнения создайте универсальный метод для приведения к моему конкретному типу.

var value = Activator.CreateInstance(ChosenType());
typeof(ReflectionHelper)
.GetMethod("CastTo")
.MakeGenericMethod(new []{value.GetType()})
.Invoke(null, value);

В invoke мы вызываем null, потому что это статический метод, если бы это был метод экземпляра, нам нужен экземпляр объекта типа Reflection Helper.

Однако я хочупредупреждаю, что эти вещи, как правило, являются запахом кода, и я призываю вас использовать рефлексию только в качестве крайней меры, а не в качестве первого шага к

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...