Возможно ли получить базу данных функций делегирования и исключить ее?

#c# #delegates

#c# #делегаты

Вопрос:

У меня ситуация, в которой мне нужно проверить поля базы данных. У каждого поля может быть свой собственный процесс проверки. Возможно ли определить функцию проверки как подпись делегата в коде C #, где реализация делегатов как NVARCHAR (MAX) находится в базе данных SQL? Затем во время выполнения я могу извлечь эту функцию из базы данных и выполнить ее.

Пример

 public delegate string ValidateFunction(List<string> Params)
.
if (Row[0].TranslateFunction != null)
{
    string test = GetTargeTableValue( new List<string> { "mm" }, Row[0].TranslateFunction);
}
.
 private string GetTargeTableValue(List<string> sqlParams, ValidateFunction FieldValidation)
{
      return FieldValidation(sqlParams);
}
.
  

Строка[0].Функция TranslateFunction находится в таблице базы данных типа NVARCHAR (max) и содержит что-то вроде
(SQL)

 'string GetUom( List<string> Params)
{return Params[0].ToUpper() } '
  

Комментарии:

1. Делегаты — это просто ссылки на функции; они не содержат кода. — C # не является языком сценариев. Весь код, который вы хотите запустить, должен быть скомпилирован. Итак, нет, это не будет работать без включения в ваш код компилятора «на лету». Невозможно для новичков.

Ответ №1:

Создайте классы проверки с возможностью сериализации (наследуйте от базового класса, чтобы все они имели общий корень). Вы можете настроить конкретные объекты требуемого типа проверки и с необходимыми данными для проверки, которые могут быть преобразованы в сериализованный текст и сохранены в вашей базе данных. Когда вы хотите проверить поле, вы можете десериализовать сохраненный текст в объект, а затем вызвать объект для поля (лучше один раз загрузить правила обратно в память в кэш и использовать их оттуда, это может быть медленным).

Извините, я не могу сразу создать пример кода (для настройки всего этого требуется немало кода), но я делал нечто подобное в предыдущей роли, где правила проверки хранились в файле конфигурации приложения.

Комментарии:

1. Большое вам спасибо за ваше время и ответ. В моем случае код не будет обновляться или изменяться после публикации в рабочей среде, в то время как для каждой платформы потребуются некоторые изменения, возможные только через библиотеки DLL или базу данных. следовательно, этот ответ не будет практичным в данной ситуации.

Ответ №2:

попробуйте это:

 // add NuGet package 'Microsoft.CodeAnalysis.Scripting'
   using Microsoft.CodeAnalysis.CSharp.Scripting;
   await CSharpScript.EvaluateAsync("System.Math.Pow(2, 4)") // returns 16
  

или

 var script = await CSharpScript.RunAsync(@"string GetUom( List<string> Params) {return Params[0].ToUpper() } ")
await script.ContinueWithAsync("GetUom(List<string> Params)");
  

Для получения дополнительной информации
Пожалуйста, посетите
Примеры скриптового API

и для получения дополнительной информации посетите

Комментарии:

1. Большое вам спасибо, ваш ответ очень помог. Этот пакет потрясающий, гибкость, которую он обеспечивает, невероятна. Еще раз спасибо за предложение.

2. Это мое удовольствие! пожалуйста, отметьте этот ответ как решение.