我想了解一種方法來將兩個或更多擴展方法傳遞給另一個方法作爲參數並返回值。我有每種數據類型的擴展方法返回一個值或默認值和值或空值,也是一個值或拋出一個錯誤。代碼具有需要其中每一個的場景,但它也具有在三元測試中結合來自每個場景的結果的場景,下面的例子。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