-1

我有一个基类,我将调用 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 本身。

4

2 回答 2

0

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

于 2018-11-15T18:03:39.483 回答
0

这是最终的工作:我为FindByID<T>我传递的方法做了一个重载b.GetType.ToString(),这给出了正确的子类。在重载中,我实例化其中一个并使用反射将其作为类型参数传递给 Dapper 扩展方法。

 public virtual T FindByID<T>(T typeInstance, long id, string typeName) where T : TypeBase
    {
        Assembly asm = Assembly.GetCallingAssembly();
        var item = asm.CreateInstance(typeName);

        using (IDbConnection cn = Connection)
        {
            MethodInfo getInfo = typeof(SqlMapperExtensions).GetMethod("Get");
            MethodInfo getGeneric = getInfo.MakeGenericMethod(item.GetType());
            item = getGeneric.Invoke(cn, new object[] { cn,id,null,null });
        }

        return (T)item;
    }

这很有效,但如果可以的话,我想避免反思。

于 2018-11-17T17:02:11.303 回答