最好用一个例子解释我的问题:
public IPlotModel MyPlotModel;
public ??? CastedModel;
public Constructor()
{
MyPlotModel = new PlotModel(); //This should be interchangable with other types
//E.g.: MyPlotModel = new OtherModel();
CastedModel = (MyPlotModel.GetType()) MyPlotModel;
}
这基本上就是我想要的。 CastedModel应该转换为MyPlotModel的类型。
我使用Convert.ChangeType()取得了一些成功。我设法将CastedModel的类型更改为正确的类型,但我无法将CastedModel的值更改为MyPlotModel。
这就是我的尝试:
Convert.ChangeType(CastedModel, MyPlotModel.GetType());
CastedModel = MyPlotModel;
但MyPlotModel仍然被识别为界面,即使它被初始化为PlotModel。
提前致谢, 亚历山大。
答案 0 :(得分:9)
这似乎应该使用泛型类:
public class Example<TPlotModel> where TPlotModel : IPlotModel, new()
{
public TPlotModel PlotModel { get; private set; }
public Example()
{
this.PlotModel = new TPlotModel();
}
}
然后您可以实例化并使用
var myExample = new Example<MyPlotModel>();
MyPlotModel foo = myExample.PlotModel;
答案 1 :(得分:1)
棘手的部分是你必须在编译时知道正确的类型 - 没有其他地方可以理解。唯一的方法是使用泛型,如@dav_i建议的那样。
考虑实例化应该如何工作 - 它是包装类应该处理的东西(dav_i的代码),还是应该从外部传递的东西呢?
你真的应该在包装类之外处理 exact 类型吗?请记住,在使用接口时,不应该根据实现接口的实际类来区别对待(查看Liskov的替换原则和OOP中的其他类似概念)。
你真的没有解释你正在做的事情背后的意图。你想在哪里使用实际的类型?界面有什么意义?你想隐藏什么,你想揭露什么?