知道传递给C#中泛型方法的参数类型的正确方法是哪种?

Lea*_*ner 1 .net c# generics reflection c#-4.0

从我的C# 4.0代码中,我想在Sybase和上执行一些查询MSSQL.正在运行时将决定/知道正在使用(或将要使用)的数据库.

我使用AseCommand,并SqlCommand分别为Sybase和SQL.

我决定创建这样的泛型方法:

private Department ExecuteCommand<T>(T databaseCommand) where T : class
{
            Department department = new Department ();

            dynamic command = databaseCommand;

            using (dynamic databaseReader = command.ExecuteReader())
            {
                if (databaseReader.HasRows)
                {

                    while (databaseReader.Read())
                    {
                         department.Employees.Add(this.CreateDepartmentInstance(databaseReader));
                    }
                }
            }

            command.Connection.Dispose();

            return department;
        }
Run Code Online (Sandbox Code Playgroud)

问题:

  1. 除了以外还有更好的选择dynamic吗?
  2. 通常知道传递给泛型方法的参数类型的正确方法是什么
  3. 当然,我可以为Sybase和SQL编写两个单独的方法.但是为什么要这样做dynamic呢?

Ric*_*lly 11

你不一定需要动态,你需要的只是一个通用接口(在这个例子中它们都有):

private Department ExecuteCommand<T>(T databaseCommand) where T : IDbCommand
Run Code Online (Sandbox Code Playgroud)

但是,在这种情况下,因为你没有做任何特别有趣的类型T(据我所知),以下方法签名就足够了:

private Department ExecuteCommand(IDbCommand databaseCommand)
Run Code Online (Sandbox Code Playgroud)

一般来说,如果没有通用接口,我建议使用Facade模式,并简单地将方法调用委托给实际实现中的等价物.

  • ......或者,不那么令人困惑的`ExecuteCommand(IDbCommand databaseCommand)` (3认同)