C#类型参数仅作为基类读取

时间:2018-11-15 17:17:41

标签: c# generics dapper-contrib

我有一个基类,我将其称为TypeBase以及从中继承的几个类,因为咧嘴笑的我们将它们称为TypeImage和TypeAsset。这是代码中发生的事情:

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;
}

所以在MethodDoingStuff中,我们有这样的东西:

  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;
    }

因此,用于存储库调用的方法sig如下所示:

cn.Get<T>(id)

出现问题的原因是{{1}}是对Dapper Extension的调用,它要查找的表基于该type参数,当然它将其视为TypeBase。相关的表数据当然在表TypeImage或TypeAsset或任何其他表中。我的自由主要在于存储库:我可以更改方法的工作方式或引入重载。我还可以更改传递给MethodDoingStuff()的参数,但是由于各种原因,不能真正更改MethodDoingStuff本身。

2 个答案:

答案 0 :(得分:0)

您正在将类型强制转换为基类。因此,当与Dapper一起使用时,它会看到TypeBase。这是继承的问题。使用界面可以帮助您解决问题。

答案 1 :(得分:0)

这就是最后的工作:我在FindByID<T>的{​​{1}}方法中进行了重载,并传递了正确的子类。在重载中,我实例化了其中之一,并使用反射将其作为类型参数传递给Dapper扩展方法。

b.GetType.ToString()

这可行,尽管我想尽可能避免反射。