#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. Это мое удовольствие! пожалуйста, отметьте этот ответ как решение.