Ich versuche, einen Weg zu verstehen, in zwei oder mehr Erweiterungs-Methoden zu einer anderen Methode als Parameter übergeben und den Wert zurückgeben. Ich habe Erweiterungsmethoden für jeden Datentyp, um einen Wert oder einen Standardwert und einen Wert oder einen Nullwert und auch einen Wert zurückzugeben oder einen Fehler zu werfen. Der Code enthält Szenarios, für die jeweils eine dieser Szenarien erforderlich ist, aber auch Szenarios, in denen die Ergebnisse der einzelnen Tests in einem ternären Test kombiniert werden (Beispiele unten).C# generische Methode take function as 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;
}
}
Ich habe versucht, eine wiederverwendbare Methode zu machen, die in diesem Beispiel IntOrNull, IntOrDefault und IntOrError und übergeben Sie zurück int oder werfen einen Fehler nehmen in verarbeiten konnte. Bisher konnte ich das nur zur Arbeit bringen. Ich versuche zu vermeiden, diese Methode für jeden Datentyp auch zu erstellen.
public static int IntDefaultValidated(this object val, string fieldName)
{
return val.IntOrNUll() != null
? val.IntOrDefaultError(fieldName)
: val.IntOrDefault();
}
Ich versuche, eine generische Methode oder einen funktionellen Stil der Methode zu erhalten, die in den Erweiterungsmethoden wie params und zurück um den Wert zu nehmen.
Ich hoffe, Reflexion zu vermeiden, wenn möglich.
//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"));
Ich werde dies so anpassen müssen, dass die Fehlerbehandlung die gleiche funktioniert. Im Original wenn jemand in einem schlechten 123a vorbeigeht. Die Fehlererweiterungsmethode würde die Exception-Nachricht auslösen, dass es sich um ein ungültiges Format handelt. Die Antwortlogik hier wird stattdessen die ValueOrNNull Exception-Nachricht ausgeben, also nicht eine vollständige Eins-zu-eins-Ersetzung. – langc334