#c# #dynamic #parameter-passing #webapi
Вопрос:
Мой Action
:
[HttpPost]
void Foo(Dictionary<string, object> prm)
{
var sql = "whatever";
var sqlPrms = new List<SqlParameter>();
if (prm.TryGetValue("Condition1",out var c1))
{
sql = " and Condition1=@c1";
sqlPrms.Add(new SqlParameter("c1", c1));
}
if (prm.TryGetValue("Condition2", out var c2))
{
sql = " and Condition2=@c2";
sqlPrms.Add(new SqlParameter("c2", c2));
}
ExecuteSql(sql, sqlPrms);
}
Дело в динамических условиях, я не могу определить класс модели параметров, но использовать Dictionary
проблему Value
можно только object
, это может привести к получению неправильного типа данных при десериализации, как лучше?
Комментарии:
1. Через какие различные объекты вы пытаетесь пройти?
2. @ErmiyaEskandary различных действий доступ к другой базе данных таблиц, так что не будет другой запрос условиях,
Employee
принять имя/пол/департамент,Store
принимает город/бренд…, но я не могу определитьEmployeeParameter
класс с именем/секс такими свойствами, потому что пользователь может просто запрос на имя, не интересует секс, я не могу писатьsex=@xx
в SQL всегда. Я не знаю, ясно ли я выразился.3. Нет, используйте класс для проверки и т.д., А затем используйте значения объектов для построения запроса — просто встроите логику, чтобы, например, не отправлять пол, если он не указан
4. @ErmiyaEskandary Проблема заключается в том, что
null
также является допустимым значением, например, дата выпуска равна нулю, означает, что еще не выпущена, пользователи могут передавать значение null для запроса неизданных элементов.5. Тогда это больше касается логики — в чем собственно вопрос?
Ответ №1:
Вы можете создать класс, содержащий все сведения, такие как имя и тип значения, и передать список/массив этого класса.
public class Parameter
{
public string Name {get;set;}
public string ValueType {get;set;}
public object Value {get;set;}
}
Тогда тип значения тогда что-то вроде "String", "Decimal", "MyOtherClass"
и т. Д.
Если вы работаете только с узко определенными типами, это может быть перечисление, но это усложнит дальнейшее расширение.