【发布时间】:2016-07-17 12:05:06
【问题描述】:
我试图了解一种将两个或多个扩展方法作为参数传递给另一个方法并返回值的方法。我对每种数据类型都有扩展方法来返回一个值或默认值、一个值或一个空值以及一个值或抛出一个错误。代码中的场景需要这些场景中的每一个,但它也有场景在三元测试中组合这些场景中的每一个的结果,示例如下。
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"));
【问题讨论】:
标签: c# generics methods functional-programming extension-methods