Как создать универсальный метод с необязательным универсальным параметром в C # - PullRequest
1 голос
/ 20 июня 2019

Я создал универсальный метод без параметра в c #.он вернет два значения параметра, которые я передаю объект списка.

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); 

Здесь я передаю класс постмодели и тега для приведения, а также передаю два параметра PostList и TagList для результата.Это вернет идеальный результат.Но мое требование заключается в том, чтобы эти классы приведения и параметры вывода были необязательными.Примерно так: когда я хочу один результат, тогда передают один класс приведения и один параметр 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);  

И когда мне нужны два результата, передайте два класса приведения и два параметра 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);  

Пожалуйста, помогите мне решить мою проблему

1 Ответ

0 голосов
/ 20 июня 2019

Вы можете создать несколько перегрузок, которые будут вызывать один и тот же закрытый метод:

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 в качестве последнего параметра.

...