加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 编译器给出隐式转换错误||我的泛型方法的约束是一个抽象泛

发布时间:2020-12-15 07:42:59 所属栏目:百科 来源:网络整理
导读:我正在编写一个程序并发现了一些常见的行为,所以我认为这对于抽象基类来说是一个合适的用例. 这是我的抽象基类的简化版本: public abstract class BehaviorClassT where T: IDomainObj { protected BehaviorClass(var x){...} public abstract void Create(
我正在编写一个程序并发现了一些常见的行为,所以我认为这对于抽象基类来说是一个合适的用例.

这是我的抽象基类的简化版本:

public abstract class BehaviorClass<T> where T: IDomainObj
    {
      protected BehaviorClass(var x){...}
      public abstract void Create(List<T> list,out string message);
      public abstract void Delete(List<T> list,out string message);
      ...
    }

这是我的派生类的简化版本:

public class DbSheets : BehaviorClass<Sheet>
    {
      public override void Create(List<Sheet> sheets,out string message){...}
      public override void Delete(List<Sheet> sheets,out string message){...}
      ...
    }

这是我想对派生类进行操作的通用方法:

public void Import<DbObj>() where DbObj : BehaviorClass<IDomainObj>
    {
      var instance = (DbObj)Activator.CreateInstance(typeof(DbObj),DbAccessor);

      // STEP 1: Remove existing values
      var existingValues = instance.Read();
      instance.Delete(existingValues,out message);

      // STEP 2: Create new IDomainObjects 
      var domainObjects = //LINQ Query.ToList();

      // STEP 3: Add new IDomainObjects to the instance
      instance.Create(domainObjects,message);
    }

到目前为止,一切都编译好,直到我尝试调用导入方法.

internal class Program
    {
      ...
      intermediary.Import<DbSheets>();
      ...
    }

这是尝试调用Import方法时出现的结果错误

The type ‘namespace.DbSheets’ cannot be used as type parameter ‘DbObj’ in the generic type or method 'intermediary.Import<DbObj>()'.
There is no implicit reference conversion from ‘namespace.DbSheets’ to 'namespace.BehaviorClass<IDomainObj>'.

我的思考过程总结:
本质上,我想要一个泛型方法只对从BehaviorClass派生的类进行操作,因为我可以可靠地知道它们共享一组常用的方法和属性. Resharper说如果我删除Import方法的泛型约束,代码将编译.我宁愿不删除该约束,因为此方法特别依赖于此共享行为将存在的事实.

注意:
我正在使用IDomainObj接口作为将泛型参数限制为特定类集的方法.此时它不包含任何特定功能.

解决方法

在我看来,你需要两个泛型类型参数:
public void Import<TBehavior,TDomain>()
    where TBehavior : BehaviorClass<TDomain>
    where TDomain : IDomainObj
{
    var instance = (TBehavior) Activator.CreateInstance(typeof(TBehavior),DbAccessor);

    // STEP 1: Remove existing values
    var existingValues = instance.Read();
    instance.Delete(existingValues,out message);

    // STEP 2: Create new IDomainObjects 
    var domainObjects = //LINQ Query.ToList();

    // STEP 3: Add new IDomainObjects to the instance
    instance.Create(domainObjects,message);
}

现在你应该可以打电话:

Import<DbSheets,Sheet>();

之前的问题是DbSheets不是BehaviorClass< IDomainObj> – 你不能调用sheet.Create(例如新的List< IDomainObj>()).

稍微笨拙的是必须指定两个类型参数,并且可能有办法避免它,但我认为这是最简单的方法.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读