[英]Converting dynamic C# objects to array
如果動態對象是Foo或Foo []類型的單個對象,是否可以將其轉換為數組?
例如,
如果dynamic為Foo,則使用數組中的1個對象轉換為Foo []
如果dynamic是具有n個對象的數組Foo [],則將其轉換為具有n個對象的Foo []數組。
我有點愚蠢...真的是您想要的嗎?
class Test
{
}
dynamic dyn = new Test();
Test[] tests = null;
if (dyn is Test)
{
tests = new Test[] { (Test)dyn };
}
else if (dyn is Test[])
{
tests = (Test[])dyn;
}
public Foo[] Create(dynamic fooOrFoos)
{
return fooOrFoos.GetType().IsArray ? fooOrFoos as Foo[] : new Foo[] { fooOrFoos };
}
也許我說的太簡單了……您是在暗示對動態值的類型一無所知嗎?
通過使用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]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.