【问题标题】:C# Casting a Class implementing interface to Class based on typeC#根据类型将实现接口的类转换为类
【发布时间】:2015-05-18 17:42:04
【问题描述】:

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

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。

提前致谢, 亚历山大。

【问题讨论】:

标签: c# interface casting


【解决方案1】:

这似乎你应该使用一个泛型类:

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;

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2017-02-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-22
      • 1970-01-01
      • 2019-06-09
      • 1970-01-01
      相关资源
      最近更新 更多