我想了解一种方法来将两个或更多扩展方法传递给另一个方法作为参数并返回值。我有每种数据类型的扩展方法返回一个值或默认值和值或空值,也是一个值或抛出一个错误。代码具有需要其中每一个的场景,但它也具有在三元测试中结合来自每个场景的结果的场景,下面的例子。c#泛型方法作为参数
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"));
我将不得不调整这使得错误处理的工作原理相同。在原来如果有人过去123a的不良整数。错误扩展方法会抛出异常消息,表明它是无效格式。这里的答案逻辑将抛出ValueOrNull异常消息,所以不是完整的一对一替换。 – langc334