【问题标题】:Is there any way that I can create a method that might have a different call and return parameter object?有什么方法可以创建一个可能具有不同调用和返回参数对象的方法?
【发布时间】:2019-01-11 09:15:47
【问题描述】:

我正在使用这种类型的代码:

lock (l)
{
   try
   {
      var data = db2.Query<CardSetWithWordCount>(qry);
      return data;
   }
   catch (Exception ex)
   {
      db2.Rollback();
      Debug.WriteLine(ex);
      Console.WriteLine(qry);
      throw;
   }
}

或者像这样的另一个例子:

lock (l)
{
   try
   {
      var data = db2.Query<CardSetDetails>(qry);
      return data;
   }
   catch (Exception ex)
   {
      db2.Rollback();
      Debug.WriteLine(ex);
      Console.WriteLine(qry);
      throw;
   }
}

除了作为 db2.Query 的返回类型的不同对象之外,代码完全相同。

由于它需要很多行,我想用一个方法替换这两个块,我调用并传入返回对象和一个 try 字符串。但我不确定从哪里开始,因为在这种情况下返回的对象是:

  <CardSetWithWordCount>

对于我想替换的每种方法,可能会有所不同(例如)。

我可以在方法中执行此操作吗?如果可以,我将如何声明参数?

【问题讨论】:

  • 你可以使用Generic Methods
  • @TobiasTengler 但 OP 表示实施可能不同
  • 那个代码有异味。需要围绕 DB 方法进行代码锁定是不常见的。
  • @KunalMukherjee 我认为“我的代码中的不同变化”意味着类型参数发生了变化。如果他的问题不够清楚,那不是我的错。我只是假设他最有可能追求什么。
  • 对于 SQLite 调用,为数据库启用 WAL 模式然后正常使用事务还不够吗? (虽然我不想引发关于这个的全面讨论,只是让您在此处与您的问题分开研究)

标签: c#


【解决方案1】:

你可以像这样使用泛型:

T RunQuery<T>(YourDB db, string qry)
{

   lock (l)
   {
       try
       {
           T data = db.Query<T>(qry);
           return data;
       }
       catch (Exception ex)
       {
          db.Rollback();
          Debug.WriteLine(ex);
          Console.WriteLine(qry);
          throw;
       }
    }
 }

这样称呼它:

YourType res=RunQuery<YourType>(db2,qry);

请查看更多信息: https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/generics/

【讨论】:

  • 你能告诉我怎么称呼它吗?谢谢
  • RunQuery(db,qry)
【解决方案2】:

传入一个类型参数作为函数参数,然后你的db2.Query 传入类型。

【讨论】:

  • 你能举例说明你的意思吗?
猜你喜欢
  • 2018-04-14
  • 2020-03-06
  • 2016-05-13
  • 1970-01-01
  • 2015-12-17
  • 2022-12-15
  • 2019-10-22
相关资源
最近更新 更多