C# 关于特定参数C的接口#

C# 关于特定参数C的接口#,c#,dictionary,interface,C#,Dictionary,Interface,我有一个动态方法(dynamicQuery),它接收一个Enum(存储过程)和一个字典,该字典将根据字典的内容填充SQLParameters 假设我在SQL server中有3个存储过程,它们采用不同的参数 命名为sp_insert_product、sp_insert_person、sp_insert_house 如何根据存储过程接受的内容强制字典接受要传递给存储过程的特定字符串 另一种比较观点。一个重载字典,就像你对方法所做的那样 编辑 可能的解决方案 我可能可以在方法dynamicQuery

我有一个动态方法(dynamicQuery),它接收一个Enum(存储过程)和一个
字典
,该字典将根据字典的内容填充SQLParameters

假设我在SQL server中有3个存储过程,它们采用不同的参数 命名为sp_insert_product、sp_insert_person、sp_insert_house

如何根据存储过程接受的内容强制字典接受要传递给存储过程的特定字符串

另一种比较观点。一个重载字典,就像你对方法所做的那样

编辑
可能的解决方案
我可能可以在方法dynamicQuery中创建一个检查,以检查字典的内容是否与指定存储过程的参数对齐

但是我想在编译时之前进行错误检查,而不是运行时检查,因为运行时检查会降低性能

我求助于ADO.NET


谢谢

如果我正确理解您的问题,您可以使用枚举作为字典的键

enum Procedures
{
    insert_prod,
    insert_person
};

var dic = new Dictionary<Procedures, string[]>();
enum过程
{
插入_prod,
插入某人
};
var dic=新字典();

如果我正确理解您的问题,您可以使用枚举作为字典的键

enum Procedures
{
    insert_prod,
    insert_person
};

var dic = new Dictionary<Procedures, string[]>();
enum过程
{
插入_prod,
插入某人
};
var dic=新字典();

如果我理解你想做什么,那么如果网站之间没有严格的合同,那就很难做到。但只要处理这两个问题的代码紧密结合在一起,这通常就不是问题,例如:

string DoSomething(string username, string value) {
    var dict = new Dictionary<string,string> {
        { nameof(username), username },
        { nameof(value), value },
    };
    SomeHelper.ExecuteSP("sp_somesp", dict);
}
string DoSomething(string username, string value) {
    SomeHelper.ExecuteSP("sp_somesp", new { username, value });
}

这几乎就是所采取的方法(除了Dapper内置了大量优化,以使反射不受伤害)。

如果我理解您的意图,那么如果站点之间没有严格的合同,那么这很难做到。但只要处理这两个问题的代码紧密结合在一起,这通常就不是问题,例如:

string DoSomething(string username, string value) {
    var dict = new Dictionary<string,string> {
        { nameof(username), username },
        { nameof(value), value },
    };
    SomeHelper.ExecuteSP("sp_somesp", dict);
}
string DoSomething(string username, string value) {
    SomeHelper.ExecuteSP("sp_somesp", new { username, value });
}

这几乎就是所采用的方法(除了Dapper内置了大量优化,以使反射不受伤害)。

它必须是一个字典吗?为什么不使用一个具有存储过程名称和DBParameter数组的类?您的意思是要坚持字典具有针对其目标对象的正确键/值吗?是的,不要使用字典,习惯于创建类来表示强类型数据。那么使用3种不同的方法来插入产品、人员和房屋怎么样?这对于调用者(我想在这里插入一个产品,所以让我调用
InsertProduct
)和方法实现来说都很容易(不需要理解“我必须调用哪个insert?”)我可以使用类而不是字典,并为每个过程创建一个类。但主要目标是可重用性。现在我想到了这一点。我确实使用Person、Product和House类中的类来调用dynamicQuery方法。但目标是限制字典中缺少参数的可能性。它必须是字典吗nary?为什么不创建一个具有存储过程名称和DBParameter数组的类?您的意思是要坚持字典具有正确的键/值,以满足其目标?是的,不要使用字典,习惯于创建类来表示强类型数据。对于inser,使用3种不同的方法如何ting product、person和house?对于调用者来说很容易(“我想在这里插入一个产品,所以让我调用
InsertProduct
),对于方法实现(无需理解“我必须调用哪个插入?”),我可以使用类而不是字典,并为每个过程创建一个类。但主要目标是可重用性。现在我想起来了。我确实使用Person、Product和House类中的类来调用dynamicQuery方法。但目标是限制字典中缺少参数的概率。这也是一个聪明的想法。我已将dynamicQuery重构为以下内容。公共图书馆动态查询(程序、词典);但是问题仍然存在,其他团队成员可以在特定查询中使用字典中的错误参数。这也是一个聪明的想法。我已将dynamicQuery重构为以下内容。公共图书馆动态查询(程序、词典);但问题仍然存在,其他团队成员可能会使用字典中的错误参数进行特定查询。