C#基于类型将类实现接口转换为Class

时间:2015-03-16 14:45:31

标签: c# interface casting

最好用一个例子解释我的问题:

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。

提前致谢, 亚历山大。

2 个答案:

答案 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中的其他类似概念)。

你真的没有解释你正在做的事情背后的意图。你想在哪里使用实际的类型?界面有什么意义?你想隐藏什么,你想揭露什么?