Ich habe den folgenden Code, dass ich als Probe verwenden verschiedene Szenarien zur Veranschaulichung:DefaultValue für optionale Guid durch Reflektion erhalten?
public static void MethodWithOptionalGuid(Guid id = default(Guid)) { }
public static void MethodWithOptionalInteger(int id = 2) { }
public static void MethodWithOptionalString(string id = "33344aaa") { }
public static void MethodWithoutOptionalParameter(int id, Guid longId) { }
static void Main(string[] args)
{
var methods = typeof(Program).GetMethods(BindingFlags.Public | BindingFlags.Static).ToList();
foreach (var method in methods)
{
PrintMethodDetails(method);
}
Console.ReadLine();
}
static void PrintMethodDetails(MethodInfo method)
{
Console.WriteLine(method.Name);
foreach (var parameter in method.GetParameters().ToList())
{
Console.WriteLine(parameter.Name +
" of type " + parameter.ParameterType.ToString() +
" with default value:" + parameter.DefaultValue);
}
Console.WriteLine();
}
Er druckt die folgenden:
MethodWithOptionalGuid
id of type System.Guid with default value:
MethodWithOptionalInteger
id of type System.Int32 with default value:2
MethodWithOptionalString
id of type System.String with default value:33344aaa
MethodWithoutOptionalParameter
id of type System.Int32 with default value:
longId of type System.Guid with default value:
Der Ausgang für die letzten drei Methoden in Ordnung zu sein scheint.
Meine Frage ist in Bezug auf die erste, MethodWithOptionalGuid: warum der Vorgabewert des Guid nicht erkannt wird?
Ich erwartete so etwas wie "0000000 -..." zu erhalten. Ich versuchte auch, den optionalen Parameter mit neuer Guid() und demselben Ergebnis zu initialisieren. Ich habe auch andere Strukturen, wie TimeSpan versucht und das Verhalten ist das gleiche.
ich erwartete, dass alle Werttypen gleich verhalten würden (wie in integer Beispiel zu sehen).
Extras: Ich fand diese Sache bei dem Versuch, in Asp.Net MVC eine Aktion mit einem optionalen Guid Parametern zu verwenden und fehlgeschlagen (hatte die Guid nullable zu machen). Ging durch MVC-Code und festgestellt, dass es den DefaultValue an einem bestimmten Punkt verwendet. Also habe ich dieses Codebeispiel gemacht, um mein Problem besser zu veranschaulichen.
@ vc74 nicht ich meine Frage aktualisiert. Während ich zustimme, dass für die letzten 3 Methoden, die Ausgabe ist, was ich erwartet habe, habe ich Schwierigkeiten, die Ausgabe für die erste Methode zu verstehen. –
Ich denke, dass die Frage von OP hauptsächlich 'MethodWithOptionalGuid' betrifft. Dort wird ein Standardwert angegeben und ich frage mich auch, warum 'default (Guid)' nicht zu "0000 .." führt. –
@ RaphaëlAlthaus Dort steht auch, dass default (Guid) | new Guid() ist ein Compiler bekannter Wert und es sollte funktionieren. Die Grundursache erklärt, warum Sie Guid.Empty nicht verwenden können. –