При использовании переменной dynamic
переменная является динамической, а не объектом, на который ссылается переменная.То есть, нет статической проверки типов, когда вы хотите получить доступ к членам объекта или хотите преобразовать его.Вам нужна другая магия, чтобы сделать это.
Вы можете обернуть Foo
в DynamicObject
, где вы можете указать, как происходит конвертация.
public class DynamicWrapper<T> : DynamicObject
{
public T Instance { get; private set; }
public DynamicWrapper(T instance)
{
this.Instance = instance;
}
public override bool TryConvert(ConvertBinder binder, out object result)
{
if (binder.ReturnType == typeof(T))
{
result = Instance;
return true;
}
if (binder.ReturnType == typeof(T[]) && binder.Explicit)
{
result = new[] { Instance };
return true;
}
return base.TryConvert(binder, out result);
}
public override string ToString()
{
return Convert.ToString(Instance);
}
}
ТогдаВы могли бы сделать это:
dynamic dobj = new DynamicWrapper<Foo>(someFoo);
Foo foo1 = dobj;
Foo foo2 = (Foo)dobj;
Foo[] arr1 = (Foo[])dobj;
// someFoo == foo1 == foo2 == arr1[0]
dynamic darr = new DynamicWrapper<Foo[]>(arr1);
Foo[] arr2 = darr;
Foo[] arr3 = (Foo[])darr;
// arr1 == arr2 == arr3
// someFoo == arr2[0] == arr3[0]