创建仅在运行时已知的类类型的新实例,并基于给定对象强制转换它

时间:2014-12-10 09:17:46

标签: c# asp.net-mvc-3 dynamic runtime

我想创建一个仅在运行时已知的类类型的新实例,并根据给定的对象强制转换它。我有一个" if"声明,因为可能的类类型是已知的。然而,这似乎不是制作可持续甚至高效代码的好方法。在c#中有更好的方法吗?

if (car.Color.GetType().ToString() == "My.Domain.ColorBlue") 
{
    ColorBlue color = new ColorBlue();
}
else if (car.Color.GetType().ToString() == "My.Domain.ColorRed")
{
    ColorRed color = new ColorRed();
}


car.Color = color;   
return PartialView("XPTO.cshtml", car);

我想将派生类传递给MVC视图,所以我真的需要将它转换为正确的类型。然后视图调用许多其他可能的部分视图之一:

           if (viewDatatype == "My.Domain.ColorBlue")

           {

               Html.RenderPartial("XPTOBlue.cshtml", @Model.Color);

           }
else if(viewDatatype == "My.Domain.ColorRed")
(...)

并且这些部分视图被强类型化为其中一个派生类,例如:

@model My.Domain.ColorBlue

1 个答案:

答案 0 :(得分:1)

除了铸造部件之外的所有部件,您只需使用:

object newInstance = Activator.CreateInstance(car.Color.GetType());

如果它总是实现特定的接口或具有特定的基类,你可以转换为那个 - 但你不能转换为实际类型,因为转换涉及知道类型在编译时。

所以你可能有:

Color newColor = (Color) Activator.CreateInstance(car.Color.GetType());

对于初学者,您应始终能够转换为car.Color的编译时类型...例如,如果您只是尝试替换现有的Color属性值在car中使用相同类型的新值,如果car.Color编译时类型为MyColor,则可以使用:

car.Color = (MyColor) Activator.CreateInstance(car.Color.GetType());