Инициализация полей класса с помощью Emit / Reflection - PullRequest
2 голосов
/ 28 мая 2011

Предположим, у меня есть три класса A, B и C, сгенерированные с помощью способностей излучения / отражения в .NET Framework, и излучающие объект следующим образом:

class A
{
   B someField1;
   C someField2;
}

Мне нужно инициализировать someField1 и someField2 после создания объекта:

A someObject;

Как это сделать? Тип someObject является объектом, но я не знаю, как привести его к типу A, созданному динамически, ввести поля и инициализировать его. Заранее благодарим за помощь.

Ответы [ 2 ]

4 голосов
/ 28 мая 2011

Вы не можете привести к динамически созданному типу в вашем коде, так как компилятор не может знать этот тип.

Вы можете сделать то, что вам нужно, несколькими способами:

// 1 - using reflection
// these will actually be your dynamically created objects...
object a = CreateA();
object b = CreateB();
System.Reflection.FieldInfo someField1 = a.GetType().GetField(
    "someField1", 
    BindingFlags.Instance | BindingFlags.NonPublic);
someField1.SetValue(a, b);

или

// 2 - using dynamic (C# 4)
dynamic a = CreateA();
dynamic b = CreateB();
a.someField1 = b;
0 голосов
/ 06 июня 2012

Просто продолжение Паоло ...

Если someField1 и someField2 известны во время компиляции (что, как представляется, имеет место), то было бы целесообразно объявить их в интерфейсе, который реализует ваш динамически создаваемый класс. Таким образом, вы можете просто подключить someObj к типу интерфейса.

interface IObjectWithFields
{
    B someField;
    C someField;
}

object a = CreateA();
((IObjectWIthFields)a).someField1 = CreateB();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...