我有两个对象:Obj
和ObjViewModel
。 ObjViewModel
内部有一个方法,如下所示:
public static implicit operator ObjViewModel(Obj o)
{
//Code to do the conversion here
}
我稍后会有一种反射方法,最终会遇到需要将List<obj>
复制到List<objViewModel>
的情况。该代码如下所示:
foreach(var p in propertyPairs)
{
if (p.ViewModel.PropertyType.GetInterfaces().Count(i => i.Name == "IList") > 0)
{
p.ViewModel.SetValue(ret, Activator.CreateInstance(p.ViewModel.PropertyType));
foreach (var v in (IList)p.Model.GetValue(m))
{
((IList)p.ViewModel.GetValue(ret)).Add(v);
}
}
else
p.ViewModel.SetValue(ret, p.Model.GetValue(m));
问题是,当我到达((IList)p.ViewModel.GetValue(ret)).Add(v);
时,永远不会在v上调用隐式转换,并且代码崩溃,因为v的类型为obj
且列表正在寻找objViewModel
。有没有人有任何想法如何解决这个问题?
答案 0 :(得分:0)
你有一个编译时类型的表达式(因为你的演员表)非泛型IList
。非通用Add
的{{1}}方法需要IList
。所以:
System.Object
只需将((IList)something).Add(v);
转换为v
即可。因此,C#编译器不会插入对用户定义转换的调用。
即使转化为System.Object
,您也可以明确地调用它,如:
implicit
可能有效的另一种可能性(我不确定你幕后的类型)是:
((IList)something).Add((ObjViewModel)v);
要求((IList<ObjViewModel>)something).Add(v);
实际实现something
。此IList<ObjViewModel>
方法是另一个采用类型Add
的参数的方法,因此C#编译器将搜索并查找用户定义的转换并发出在ObjViewModel
上调用它的IL代码。