Преобразование динамических объектов C # в массив - PullRequest
1 голос
/ 20 октября 2011

Есть ли способ преобразовать динамический объект в массив, если это один объект типа Foo или Foo []?

Например,

если динамическим является Foo, тогда преобразовать в Foo [] с 1 объектом в массиве

если динамическим является массив Foo [] с n числом объектов, то преобразовать в Foo [] с n количеством объектов в массиве.

Ответы [ 3 ]

6 голосов
/ 20 октября 2011

Я чувствую себя немного глупо ... Ты действительно этого хочешь?

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;
}
3 голосов
/ 20 октября 2011
public Foo[] Create(dynamic fooOrFoos)
{
    return fooOrFoos.GetType().IsArray ? fooOrFoos as Foo[] : new Foo[] { fooOrFoos };
}

Возможно, я делаю это слишком просто ... Вы намекаете, что ничего не знаете о типе динамического значения?

2 голосов
/ 20 октября 2011

При использовании переменной 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]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...