从动态对象复制列表

时间:2015-04-16 07:50:28

标签: c# list

我正在写一个转换方法。我正在创建一个类型为A的对象并接收一个类型为B的对象。类型A和B的内容相同但参数相同但名称空间不同。

    static CompositeType temp = new CompositeType();        
    static ServiceReference.CompositeType B = new ServiceReference.CompositeType();   
    public static void clone(dynamic composite) //B passed here
    {
        temp.mName = composite.mName;
        temp.mCpuUsage = composite.mCpuUsage;
        temp.mRamAvailable = composite.mRamAvailable;
        temp.mTimeAlive = composite.mTimeAlive;
        //So far so good, everything is OK.

        temp.deks = composite.deks.ToList(); //This throws an exception
        temp.deks = new List<type>(composite.deks); //this doesn't work either
    }

例外:

  

Microsoft.CSharp.RuntimeBinder.RuntimeBinderException:'System.Collections.Generic.List.Add(serv.type)'的最佳重载方法匹配有一些无效的参数

1 个答案:

答案 0 :(得分:1)

正如Skeet所建议的,但请注意,您无法直接使用LINQ方法,因为扩展方法不能自动与动态一起使用:

IEnumerable<dynamic> deks = composite.deks;
temp.deks = deks.Select(ConvertSubItem).ToList();

然后:

static deksamenes ConvertSubItem(dynamic subItem)
{
    var sub = new deksamenes();
    sub.Something = subItem.Something;
    return sub;
}

请注意,如果deks的项类型为值类型(例如int),则无法使用。

IEnumerable<dynamic>应该有效,因为IEnumerable<T>是协变的,因此如果IEnumerable<Foo>IEnumerable<object>IEnumerable<dynamic>可以隐式投放到Foo或{{1}}参考类型)