首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >无法将基类强制转换为派生类

无法将基类强制转换为派生类
EN

Stack Overflow用户
提问于 2018-10-30 20:22:01
回答 2查看 105关注 0票数 1

系统开发人员在这里接受培训...

我正在进行一个.net核心项目,我们试图创建一个“漂亮的架构”。

目前,我们有这些项目: Models,DAL,BLL,UI (也按这个顺序引用)。

然而,我们刚刚决定从实体框架切换到dapper,因此我们将松散延迟加载,以及来自ef的其他功能。

我的解决方案是在models类中删除“基本”models项目中的引用,并在BLL中拥有“派生”类。

然而,当我使用BL层存储库时,我发现自己需要从基本模型类转换到派生的扩展模型,从而给我一个InvalidCastException

我哪里错了?从一开始就这样做的“适当”方式是什么?

示例

在我的模型项目中,我将有一个class foo,在BLL中有一个类:class foo : Models.foo,然后在BLL存储库中有一个class fooRepository方法,如下所示:

代码语言:javascript
复制
public foo GetFooById(int Id) {
    return (foo)DAL.FooRepository.GetById(Id) 
}

  • 这里的foo将是BLL中的models扩展,但从DAL开始的扩展将是foo的基类。

特定的可编译示例:https://github.com/jona8690/ChildInheritanceExample

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-10-31 06:44:19

好吧,这花了我一段时间。我大概猜到了,但是您的类实际上与其祖先具有相同的名称,但在不同的名称空间中,因此第一次阅读代码时,您的dal和bll使用的是同一个类。

那么,为什么这不起作用呢?当你转换一个对象时,答案归结于你在做什么和不在做什么。您实际上并不是在改变对象。强制转换只是将编译时检查移动到运行时检查。让我们简化一下你的例子。

这将会起作用:

代码语言:javascript
复制
object o = new Foo();
Foo myFoo = (Foo)o;

这是可以编译的,但在运行时会抛出您的invalidcastexception。

代码语言:javascript
复制
object o = new Bar();
Foo myFoo = (Foo)o;

为什么?因为Bar不是Foo。

或者在上面的评论中使用有用的水果示例。

代码语言:javascript
复制
public class Fruit {}
public class Banana : Fruit {}
public class Apple : Fruit {}

private Fruit getFruit()
{
  return new Banana();
}

private void DoSomething()
{
  Apple apple = (Apple)this.getFruit(); // obviously can't cast
}

但是,我听到你的抗议,我的情况是不同的,因为苹果不是从香蕉中下来的。这是真的,但是请记住,除了基本的Fruit类之外,Apple还将具有属性和方法,应用程序在处理它所知道的Apple而不是任何其他Fruity类型时可以使用这些属性和方法。

在您的案例中,您期望的是一个比您的dal提供的更专业类型的Bar

票数 1
EN

Stack Overflow用户

发布于 2018-10-30 21:38:26

你可以通过反省或检查属性来判断这个“水果”是否是“苹果”--然后只判断它是否能够成为“苹果”?

捕获从存储库对象返回的对象,检查/比较对象的object.GetType()结果的结果,如果合适,只返回cast/convert对象,否则是否进行适当的null返回或错误响应?

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53064219

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档