簡體   English   中英

將動態C#對象轉換為數組

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM