我正在写一个转换方法。我正在创建一个类型为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)'的最佳重载方法匹配有一些无效的参数
答案 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}}参考类型)