Сегодня я столкнулся с проблемой при попытке установить поле с использованием FieldInfo.SetValue()
, передав DynamicObject
в качестве второго аргумента. В моем случае поле является Guid
, а DynamicObject
должно иметь возможность конвертировать себя в один (с использованием TryConvert
), но с ошибкой ArgumentException
.Использование FieldInfo.SetValue с DynamicObject как аргумент 2
Некоторый код, который показывает проблему:
// Simple impl of a DynamicObject to prove point
public class MyDynamicObj : DynamicObject
{
public override bool TryConvert(ConvertBinder binder, out object result)
{
result = null;
// Support converting this to a Guid
if (binder.Type == typeof(Guid))
{
result = Guid.NewGuid();
return true;
}
return false;
}
}
public class Test
{
public Guid MyField;
}
class Program
{
static void Main(string[] args)
{
dynamic myObj = new MyDynamicObj();
// This conversion works just fine
Guid guid = myObj;
var test = new Test();
var testField = typeof(Test).GetField("MyField");
// This, however, fails with:
// System.ArgumentException
// Object of type 'ConsoleApplication1.MyDynamicObj' cannot be converted to type 'System.Guid'.
testField.SetValue(test, myObj);
}
}
Я не очень хорошо знакомы со всем dynamicness в C# 4, но это чувствовал, мне как-то, что должно работать .. Что я делаю неправильно? Есть ли другой способ сделать это?
Ouch. Конечно. * шлепает лоб * – CodingInsomnia
Итак, каким-то образом вокруг него? Могу ли я каким-либо образом вызвать преобразование, учитывая, что я знаю только тип во время выполнения? – CodingInsomnia
@CodingInsomnia: Смотрите мое редактирование :) –