【问题标题】:Passing generic template as an argument [closed]将通用模板作为参数传递[关闭]
【发布时间】:2014-04-23 14:25:06
【问题描述】:

尝试在下面实现重用。

if(update)
   var updateType = (A)request;
   updateType.Entity.NameFlag = nameValue;
   updateType.Entity.PhoneFlag = phoneValue
else
   var addType = (B) request;
   addType.Entity.NameFlag = nameValue;
   addType.Entity.PhoneFlag = phoneValue

如您所见,唯一的区别是对象(A 或 B)。

如何使用T模板实现复用?

【问题讨论】:

    标签: c# templates generics reusability


    【解决方案1】:
    public void SomeMethod<A,B>()  where A : BaseTypeA where B : BaseTypeB
    {
      if(update)
      {
          var updateType = (A)request;
          updateType.Entity.NameFlag = nameValue;
          updateType.Entity.PhoneFlag = phoneValue;
      }
      else
      {
          var addType = (B) request;
          addType.Entity.NameFlag = nameValue;
          addType.Entity.PhoneFlag = phoneValue;
      }
    }
    

    试试上面的

    【讨论】:

    • 已更新约束
    • 不确定这是否真的实现了代码重用。鉴于 A 和 B 不是从同一个基类继承的,这与泛型一样好。
    • 我同意。我可能还会提出这样的论点,即有限的代码重用并不能保证基类和泛型的额外复杂性。
    • @TGH - 你能更新代码吗 addType.Entity.NameFlag = nameValue; addType.Entity.PhoneFlag = phoneValue;可以重复使用吗?
    【解决方案2】:
    public void DoStuff<T>(T item)
       where T : BaseClasseOrInterfaceOfAandB
    {       
       item.Entity.NameFlag = nameValue;
       item.Entity.PhoneFlag = phoneValue
    }
    
    if(update)
    {
        DoStuff((A)request);
    }
    else
    {
        DoStuff((B)request);
    }
    

    【讨论】:

    • 不能这样做.. 我需要转换项目以便它识别实体对象
    • 两者都有不同的基本情况,我无法编辑/添加基本代码的接口,因为它是使用第三方工具生成的。
    • 您可能已经注意到有人投票结束您的问题“太宽泛”。那是我。这是根据您提供的非常有限的信息对答案的最佳猜测。你想重用什么?什么是“请求”? “代码生成”是什么以及如何生成的?请用实际的目标语言实际编写您的伪代码,或者至少描述该语言到底是什么。
    • @overrule,如果它们不是从同一个基类继承的,泛型对你没有多大帮助。你可以进入反射孔,但这是你“重用”的唯一希望
    • @Aron - Entity 属性无法解析,除非它被强制转换。我正在实施你所描述的。
    猜你喜欢
    • 1970-01-01
    • 2013-11-08
    • 2016-05-03
    • 1970-01-01
    • 1970-01-01
    • 2011-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多