繁体   English   中英

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

[英]C# Casting a Class implementing interface to Class based on type

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

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。

先谢谢,亚历山大。

这似乎应该使用泛型类:

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;

棘手的部分是你必须在编译时知道正确的类型 - 没有其他地方可以理解。 唯一的方法是使用泛型,如@dav_i建议的那样。

想想实例化应该如何工作 - 包装类应该处理的东西(dav_i的代码),还是应该从外部传递的东西呢?

你真的应该处理包装类之外的确切类型吗? 请记住,在使用接口时,不应该根据实现接口的实际类来区别对待(查看Liskov的替换原则和OOP中的其他类似概念)。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM