将动态C#对象转换为数组

时间:2011-10-20 19:14:53

标签: c# c#-4.0 dynamic

有没有办法将动态对象转换为数组,如果它是Foo或Foo []类型的单个对象?

例如,

如果dynamic是Foo,则使用数组中的1个对象转换为Foo []

如果dynamic是一个包含n个对象的数组Foo [],则转换为Foo [],其中包含n个数组中的对象。

3 个答案:

答案 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]