有没有办法将动态对象转换为数组,如果它是Foo或Foo []类型的单个对象?
例如,
如果dynamic是Foo,则使用数组中的1个对象转换为Foo []
如果dynamic是一个包含n个对象的数组Foo [],则转换为Foo [],其中包含n个数组中的对象。
答案 0 :(得分:6)
我觉得有点愚蠢...这真的是你想要的吗?
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;
}
答案 1 :(得分:3)
public Foo[] Create(dynamic fooOrFoos)
{
return fooOrFoos.GetType().IsArray ? fooOrFoos as Foo[] : new Foo[] { fooOrFoos };
}
也许我让这个太容易了......你暗示你对动态值的类型一无所知吗?
答案 2 :(得分:2)
通过使用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]