簡體   English   中英

如何在C#中使用可選的通用參數創建通用方法

[英]how to create a generic method with optional generic parameter in c#

我在c#中創建了帶out參數的通用方法。 它將返回我通過列表對象的兩個out參數值。

public void ExecuteList<T, T1>(out List<T> obj, out List<T1> obj1, string sql, params object[] parameters) where T : class
{
    using (var db = _context)
    {
        var cmd = db.Database.Connection.CreateCommand();
        cmd.CommandText = sql;
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.Parameters.AddRange(parameters);
        try
        {
            db.Database.Connection.Open();
            using (var reder = cmd.ExecuteReader())
            {
                obj = ((IObjectContextAdapter)db).ObjectContext.Translate<T>(reder).ToList();
                reder.NextResult();
                obj1 = ((IObjectContextAdapter)db).ObjectContext.Translate<T1>(reder).ToList();
            }
        }
        finally
        {
            db.Database.Connection.Close();
            cmd.Dispose();
        }
    }
} 

調用此方法

List<SqlParameter> parameterList = new List<SqlParameter>(); 
parameterList.Add(new SqlParameter("@pageNo", 1));
parameterList.Add(new SqlParameter("@pageSize", 5)); 
SqlParameter[] parameters = parameterList.ToArray();
List<PostModel> PostList = new List<PostModel>();
List<Tag> TagList = new List<Tag>();
Uow.ExecuteList<PostModel,Tag>(out PostList, out TagList, "[dbo].[sp_getdata]", parameters); 

在這里,我傳遞了postmodel和tag類進行轉換,還傳遞了兩個參數PostList和TagList作為結果。 它將返回完美的結果。 但是我的要求是這些轉換類,out參數應該是可選的。 像這樣:當我想要一個結果時,則傳遞一個轉換類和一個Out參數。

List<SqlParameter> parameterList = new List<SqlParameter>();
parameterList.Add(new SqlParameter("@pageNo", 1));
parameterList.Add(new SqlParameter("@pageSize", 5)); 
SqlParameter[] parameters = parameterList.ToArray();
List<PostModel> PostList = new List<PostModel>(); 
Uow.ExecuteList<PostModel>(out PostList, "[dbo].[sp_getdata]", parameters);  

當我想要兩個Result時,則傳遞兩個強制轉換類和兩個out參數。

List<SqlParameter> parameterList = new List<SqlParameter>();
parameterList.Add(new SqlParameter("@pageNo", 1));
parameterList.Add(new SqlParameter("@pageSize", 5)); 
SqlParameter[] parameters = parameterList.ToArray();
List<PostModel> PostList = new List<PostModel>();
List<Tag> TagList = new List<Tag>();
Uow.ExecuteList<PostModel,Tag>(out PostList, out TagList, "[dbo].[sp_getdata]", parameters);  

請幫我解決我的問題

您可以創建多個重載,這些重載將調用相同的私有方法:

private void Execute<T, T1>(ref List<T> obj, ref List<T1> obj1, string sql, params object[] parameters) where T : class
{
    using (var db = _context)
    {    
        var cmd = db.Database.Connection.CreateCommand();
        cmd.CommandText = sql;
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.Parameters.AddRange(parameters);
        try
        {
            db.Database.Connection.Open();
            using (var reader = cmd.ExecuteReader())
            {
                obj = ((IObjectContextAdapter)db).ObjectContext.Translate<T>(reader).ToList();
                if(obj1 != null) {
                    reader.NextResult();
                    obj1 = ((IObjectContextAdapter)db).ObjectContext.Translate<T1>(reader).ToList();
                }                
            }
        }
        finally
        {
            db.Database.Connection.Close();
            cmd.Dispose();
        }
    }
}

public void ExecuteList<T, T1>(out List<T> obj, out List<T1> obj1, string sql, params object[] parameters) where T : class
{
    obj = new List<T>();
    obj1 = new List<T1>();
    Execute(ref obj, ref obj1, sql, parameters);
}

public void ExecuteList<T>(out List<T> obj, string sql, params object[] parameters) where T : class
{
    obj = new List<T>();
    List<object> stub = null;//generic argument doesn't matter because it will not be used
    Execute<T, object>(ref obj, ref stub, sql, parameters);
} 

請注意,我的第一個方法是私有方法,僅應從公共重載中調用(可以根據需要添加任意數量的輸出參數/重載)。

同樣也可能將T1也限制為class ,並使用List<SqlParameter>代替params object[] parameters作為最后一個參數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM