Я пытаюсь понять способ передать в двух или более методах расширения другому методу в качестве параметров и вернуть значение обратно. У меня есть методы расширения для каждого типа данных, чтобы вернуть значение или значение по умолчанию, а также значение или нулевое значение, а также значение или выбросить ошибку. В коде есть сценарии, которые потребуют каждого из них, но также имеют сценарии, объединяющие результаты каждого из них в тройном тесте, примеры ниже.C# generic method принимает функцию как param
public static int IntOrError(this object val, string fieldName)
{
int test;
if (string.IsNullOrEmpty(val.ToString()))
{
throw new Exception("I threw it");
}
else if (int.TryParse(val.ToString(), out test) == false)
{
throw new Exception("Bad Int Value");
}
else
{
return test;
}
}
public static int IntOrDefault(this object val)
{
int test;
if (int.TryParse(val.ToString(), out test))
{
return test;
}
else
{
return -1;
}
}
public static int? IntOrNull(this object val)
{
int test;
if (int.TryParse(val.ToString(), out test))
{
return test;
}
else
{
return -1;
}
}
Я пытался сделать многоразовый метод, который может обрабатывать принимать в в этом примере IntOrNull, IntOrDefault и IntOrError и передать обратно Int или бросить ошибку. До сих пор я только мог заставить это работать. Я также пытаюсь избежать создания этого метода для каждого типа данных.
public static int IntDefaultValidated(this object val, string fieldName)
{
return val.IntOrNUll() != null
? val.IntOrDefaultError(fieldName)
: val.IntOrDefault();
}
Я пытаюсь получить универсальный метод или функциональный стиль метода, который будет принимать в методах расширения, как параметры, так и вернуться обратно значение.
Я надеюсь избежать отражения, если это возможно.
//just a psuedo example
var intVal = "";
var valRet = DefaultValidated(intVal.IntOrNull(), intVal.IntOrdefault(), intVal.IntOrDefaultError("intVal"));
//or maybe like this, or some combination of extension, generic, functional
var valRet = intVal.DefaultOrValidated(IntOrNull(intVal), IntOrDefault(intVal), IntOrDefaultError(intVal, "intVal"));
Я должен настроить это так, что обработка ошибок работает так же. В оригинале, если кто-то прошёл в плохом int 123a. Метод расширения ошибки выкинул бы сообщение об исключении, что он был недопустимым. Логика ответа здесь вместо этого выведет сообщение ValueOrNull Exception, а не полную замену на один. – langc334