Нет, это не должно работать - потому что динамическая часть заканчивается там, где заканчивается ваш код.Компилятор вызывает метод с сигнатурой
void SetValue(Object obj, Object value)
Этот вызов метода является динамическим, но он просто собирается закончить передачей ссылки на экземпляр MyDynamicObj
.Вызов разрешается во время выполнения, но ничего в SetValue
ничего не знает о динамической природе объекта, чью ссылку вы передаете.
В основном вам нужно выполнить динамическую часть (преобразование в этомcase) в вашем коде - бит, в котором компилятор C # 4 выполняет все свои трюки.Вы должны выполнить это преобразование, и затем вы можете позвонить SetField
.
Иными словами, это немного похоже на вызов SetField
с полем типа XName
, но переходящий в строку.Да, есть преобразование из string
в XName
, но это не работа SetField
, чтобы решить это.Это работа компилятора.
Теперь, вы можете заставить это работать, заставив компилятор выполнить часть работы, но вам все равно нужно сделать это с отражением:
static void Main(string[] args)
{
dynamic myObj = new MyDynamicObj();
var test = new Test();
var testField = typeof(Test).GetField("MyField");
var method = typeof(Program)
.GetMethod("Convert", BindingFlags.Static | BindingFlags.NonPublic);
method = method.MakeGenericMethod(testField.FieldType);
object converted = method.Invoke(null, new object[] {myObj});
testField.SetValue(test, converted);
}
static T Convert<T>(dynamic input)
{
return input;
}