2つ以上の拡張メソッドを別のメソッドにパラメータとして渡して値を返す方法を理解しようとしています。私は、各データ型が値またはデフォルト値と値またはヌル値と値を返す、またはエラーをスローする拡張メソッドを持っています。コードにはこれらのそれぞれが必要なシナリオがありますが、以下の例では3つのテストでこれらの結果を組み合わせたシナリオもあります。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();
}
拡張メソッドをparamsとして受け取り、値を返す汎用メソッドまたはメソッドの機能スタイルを取得しようとしています。
可能であれば、反射を避けることを望んでいます。
//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の悪いintで過去の場合。 Error拡張メソッドは、それが無効な形式であるという例外メッセージをスローします。ここでの答えロジックは、代わりにValueOrNull Exceptionメッセージをスローします。したがって、完全な1対1置換ではありません。 – langc334