Я создаю тип во время выполнения, используя Reflection.Emit
. Проблема в том, что всякий раз, когда я создаю экземпляр нового типа, я должен использовать object
или dynamic
, потому что этот тип неизвестен во время компиляции. Это отлично работает, за исключением тех случаев, когда я хотел бы, чтобы другой тип неявно приводил к новому типу во время назначения. Переменная счастливо принимает новое значение и соответствует соответствующему типу, не пытаясь применить его к текущему типу.Можно ли использовать неявные приведения типов, созданных во время выполнения в C#?
Есть ли способ создать переменную только что созданного типа, которая позволит использовать неявное литье? Я с удовольствием откажусь от проверки времени компиляции, но я бы хотел, чтобы эти приведения, по крайней мере, были предприняты во время выполнения.
Edit:
Вот пример, чтобы сделать его более ясным. Это то, что происходит, когда вы знаете, типа во время компиляции:
MyClass a;
//this calls the implicit cast operator and 'a' stays of the same type
a = 5;
и это то, что произойдет, если вы этого не сделаете:
Type t = CreateTypeUsingTypeBuilder();
object a = Activator.CreateInstance(t);
//this does not call the implicit cast operator and 'a' just becomes in integer
a = 5;
Кроме того, я не удивлен таким поведением или спрашивая, почему это происходит. Я спрашиваю, существует ли какое-либо решение для достижения желаемого поведения, когда он проверяет наличие неявного оператора во время выполнения.
Это действительно неясно, что вы имеете в виду, я боюсь, но если тип не существует во время компиляции, трудно понять, как вы ожидаете, что компилятор узнает, что будет доступно неявное преобразование. Если бы вы могли дать нам конкретный пример того, что вы пытаетесь сделать, это действительно поможет. –
Неявное кастинг требует знания во время компиляции некоторого типа исходного объекта (чтобы определить, для какого оператора неявного преобразования нужно позвонить). Вы можете реализовать интерфейс; или использовать динамические и предоставлять необходимые имплицитные операторы преобразования. – Richard
Вероятно, вы хотите определить интерфейс, который описывает, какие свойства и методы имеет этот испущенный объект, который вы хотите использовать в приложении. Извлеките свой код, а затем передайте результат в этот интерфейс. Очевидно, что класс, который вы создаете, должен реализовать интерфейс. Но это даст вам хорошее время. – Will