返回列表的通用方法[关闭]

Posted

技术标签:

【中文标题】返回列表的通用方法[关闭]【英文标题】:Generic method that returns list [closed] 【发布时间】:2017-12-22 17:33:21 【问题描述】:

我们正在开发数据访问框架库,供业务组件调用以访问 SQLlite DB for Xamarin 应用程序。 要对 DB 执行 SELECT Sql,编写了以下方法。不熟悉匿名方法并使用新功能,因此需要建议 我正在寻找任何方法来提高此实施的效率。

 private static readonly Lazy<AppDB> Lazy =  new Lazy<AppDB>(() => new AppDB());

        public static AppDB Instance => Lazy.Value;
        private SQLiteAsyncConnection _conn =null;
        static object locker = new object();
        private SQLiteAsyncConnection DbConnection
        
            get
            
                if (_conn == null)
                
                    LazyInitializer.EnsureInitialized(ref _conn, DependencyService.Get<ISQLite>().GetAsyncConnection);
                
                return _conn;
            
        
     public List<T> ExecuteQuery<T>(string sqlQuery, object[] parameters = null) where T: class
            
                List<T> l = new List<T>();
                try
                
                    l = parameters !=null ? DbConnection.QueryAsync<T>(sqlQuery,parameters).Result : DbConnection.QueryAsync<T>(sqlQuery).Result;
                
                catch (Exception e)
                 
                return l;
            

【问题讨论】:

你具体有什么问题?你的问题现在有点宽泛。 请不要写像catch (Exception e)这样的代码,更不用说catch (Exception e) 了。捕获基本异常是一种糟糕的反模式。 你为什么打电话给new List&lt;T&gt;();只是为了重新分配l 你从哪里得到DbConnection.QueryAync&lt;T&gt;(...) 【参考方案1】:

你的代码应该更像这样:

public List<T> ExecuteQuery<T>(string sqlQuery, object[] parameters = null) where T : class

    if (parameters != null)
    
        return DbConnection.Query<T>(sqlQuery, parameters)
    
    else
    
        return DbConnection.Query<T>(sqlQuery);
    

或者更好,像这样:

public List<T> ExecuteQuery<T>(string sqlQuery, object[] parameters = null) where T : class

    using (var dbc = new DbConnection())
    
        if (parameters != null)
        
            return dbc.Query<T>(sqlQuery, parameters).ToList();
        
        else
        
            return dbc.Query<T>(sqlQuery).ToList();
        
    

您现有的代码中存在很多问题。如果您真的想获得一些好的指导,您真的应该发布更多代码。

【讨论】:

我添加了额外的代码。QueryAsync 是 SqlliteAsynconnection 对象的内置方法【参考方案2】:

在 catch 块中,您可以将 null 值分配给列表,以便您可以根据 null 条件在屏幕上进行适当的消息和错误处理。

catch (Exception e)

  l = null;
  //You can log the exception details in windows event viewer to see complete details.

【讨论】:

【参考方案3】:

您应该重新抛出异常或抛出新异常并在调用它时捕获它。

public List<T> ExecuteQuery<T>(string sqlQuery, object[] parameters = null) where T: class

    try
    
        var l = parameters !=null ? DbConnection.QueryAsync<T>(sqlQuery,parameters).Result : DbConnection.QueryAsync<T>(sqlQuery).Result;
        return l;
    
    catch (Exception e)
     
        throw;
        // or throw new MyCustomRepositoryException(e);
    


// Usage:
try

    var documents = myClass.ExecuteQuery<Document>(...);

catch (Exception ex) // or catch (MyCustomRepositoryException ex) 

    // do whatever your system is expected to do in case of error

从技术上讲,您可以忽略错误并返回 nullnew List&lt;T&gt;,但在大多数情况下,它在架构上是错误的:

“给我列表或抛出异常”是具有List&lt;T&gt; 返回值的方法的预期行为 被调用者将无法区分空列表和错误(在List&lt;T&gt; 的情况下)/找不到对象或错误(在T 的情况下) 它对DbConnection 增加了一些要求,它应该是可恢复的。某些对象无法从异常中恢复,因此您可以尝试继续使用处于故障状态的对象 它不保证停止代码执行,它可能会导致被调用方法甚至其他代码位置出现意外行为 等

【讨论】:

以上是关于返回列表的通用方法[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

通用方法总是返回NULL [关闭]

如何让 Java 方法返回任何类型的通用列表?

FxCop 说我应该返回一个通用列表接口而不是字节数组。我是否该? [关闭]

在 C# 中将通用列表转换为数据集 [关闭]

c# - 从 SqlDataReader 填充通用列表

返回未知的通用列表<T>