2016-02-08 8 views
0

Я использую Reflection.Emit и TypeBuilder для создания нового типа во время выполнения. Моя установка что-то вроде:Могу ли я задать тип поля внутри класса во время выполнения для вновь созданного типа в C#?

public class MyClass { 
    public object MyField = CreateInstanceOfNewType(); 
    public MyClass() {} 
} 

Вопрос заключается в том, что MyClass.MyField объявлена ​​с типом object и поэтому неявные операторы литые, которые существуют для нового типа не вызывается, когда литьевые типы присваиваются MyClass.MyField. Есть ли способ установить тип поля для вновь созданного типа, чтобы он вел себя так же, как и в типичном случае?

+0

Будет ли тип реализовывать известный интерфейс? Если это так, просто присвойте * object * переменной, введенной в качестве этого интерфейса. –

+0

Неявные операторы литья не могут быть определены в интерфейсах. Это происходит вокруг изменения типа при назначении, но не позволит использовать неявные отбрасывания. –

+0

Просьба описать вашу фактическую бизнес-проблему, вместо этого, невозобновляемое решение для неизвестной проблемы. Вы правы - C# не позволяет этому решению работать. Это не означает, что ваша проблема неразрешима. –

ответ

1

Это зависит от конкретного варианта использования. Возможное решение состоит в том, чтобы сделать ваш класс общим, а затем использовать отражение для создания статического универсального метода, который создает экземпляр класса. Это позволяет использовать переменный динамический тип при объявлении вашего имущества:

public class MyClass<T> { 
public T MyField = CreateInstanceOfNewType<T≥(); 
public MyClass() {} 
} 

public static MyClass<T> createClass<T>() { 
return new MyClass<T>: 
} 

dynamic instanceOfMyClass = typeof(SomeClass).GetMethod("createClass").MakeGeneric(dynamicType).Invoke() 

Другим вариантом является использование динамического ключевого слова.

+0

Когда я использую 'dynamic', он просто ведет себя так же, как если бы я использовал' object'. Когда я пытаюсь назначить другой тип, он просто берет новый тип, а не форсирует неявный листинг. –

+0

Какой тип возвращает ваш createinstanceofclass? – user3312721

0

Если я правильно понял, вы хотите, чтобы инициализировал объект вашего нового типа с объектом некоторого типа, который вы используете, для которого вы создали неявный оператор литья. Я бы предположил, что вместо неявных операторов вы рассматриваете использование конструкторов: используйте Reflection.Emit для создания конструкторов, которые берут один параметр ваших типов, подлежащих выполнению, и используют это значение параметра для инициализации объекта нового типа. Вы хотите иметь такой же результат, как этот кусок кода будет делать:

public class MyNewType 
{ 
    public MyNewType(CastableType value) 
    { 
     /* implement initialization with value */ 
    } 

    /* other stuff */ 
} 

Вы можете использовать Activator.CreateInstance(Type type, params object[] arguments), чтобы использовать этот конструктор. Вот пример:

var newType = GetNewType(); 
var castableObject = CreateInstanceOfCastableType(); 
this.MyField = Activator.CreateInstance(newType, castableObject); 

 Смежные вопросы

  • Нет связанных вопросов^_^