不调用隐式转换

时间:2014-05-19 20:25:51

标签: c# reflection implicit-conversion

我有两个对象:ObjObjViewModelObjViewModel内部有一个方法,如下所示:

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。有没有人有任何想法如何解决这个问题?

1 个答案:

答案 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代码。