c# - C# 类型参数仅读取为基类
问题描述
我有一个基类,我将调用 TypeBase 和几个从它派生的类,因为笑声让我们称它们为 TypeImage 和 TypeAsset。以下是代码中发生的情况:
...
TypeBase b = null;
MethodDoingStuff(passedID, ref b);
RepositoryCall(b, otherArgs);
所以在 MethodDoingStuff 我们有这样的东西:
public bool MethodDoingStuff (long passedID, ref TypeBase b)
{
object concrete = DbCallThatGetsSubclass(passedID);//returns a subclass
of TypeBase(in reality more than 2 possibilities)
TypeBase tb = (TypeBase)concrete;
b=tb;
return true;
}
因此,Repository 调用的方法 sig 如下所示:
public virtual T FindByID<T>( T typeInstance, long id) where T : TypeBase
{
T item = (T)Activator.CreateInstance(typeof(T));
using (IDbConnection cn = Connection)
{
item = cn.Get<T>(id);
}
return item;
}
问题出现在cn.Get<T>(id)
对 Dapper Extension 的调用中,它查找的表是基于该类型参数的,它当然将其视为 TypeBase。相关的表格数据当然是在表格 TypeImage 或 TypeAsset 或其他表格中。我的自由主要在于存储库:我可以更改方法的工作方式或引入重载。我也可以更改传递给 MethodDoingStuff() 的参数,但由于各种原因不能真正更改 MethodDoingStuff 本身。
解决方案
您正在将类型转换为基类。因此,当您与 Dapper 一起使用时,它会看到 TypeBase。这是继承的问题。使用界面可能会帮助您解决问题。
推荐阅读
- acumatica - 是否可以复制课程以制作标准 Acumatica 功能的自定义副本?
- vbscript - 从 json 字符串中删除尾随逗号的 VBScript 函数
- wordpress - Wordpress 重写规则以创建漂亮的 URL
- python - Python:如何获取具有名称列表、两列格式的导入文本文件,并将它们按字母顺序放入 python 中?
- verilog - 不支持在表达式中使用时钟信号
- java - 在 Java BufferedImage 中应用桶形失真校正,但结果相当混乱
- android - 为什么我的带有 Dagger2 实现的 DI 崩溃了?
- ios - 使用以前使用的模板提交 Apple iOS 应用程序
- reactjs - 为什么编译器警告未定义?
- c# - 如何使用约束使多个按钮居中?