我想创建一个仅在运行时已知的类类型的新实例,并根据给定的对象强制转换它。我有一个" 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
答案 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());