Generische Methode zurückgeben Nullable-Typ Werte
Schrieb ich unter Methode mit folgenden Anforderungen
- Eingang xmlnode-und Attributname
- geben den Wert zurück, wenn es gefunden wird mit dem Attribut name übergeben
-
Wo es keinen Wert in Attributname übergeben wird, sollte es wieder -
3.1. Für int -1
3.2. Für Datetime DateTime.MinValue
3.3. Für den String " null
3.4. Für bool, null
Unten-Methode fehlschlägt für den Fall, 3.4.
public T AttributeValue<T>(XmlNode node, string attributeName)
{
var value = new object();
if (node.Attributes[attributeName] != null && !string.IsNullOrEmpty(node.Attributes[attributeName].Value))
{
value = node.Attributes[attributeName].Value;
}
else
{
if (typeof(T) == typeof(int))
value = -1;
else if (typeof(T) == typeof(DateTime))
value = DateTime.MinValue;
else if (typeof(T) == typeof(string))
value = null;
else if (typeof(T) == typeof(bool))
value = null;
}
return (T)Convert.ChangeType(value, typeof(T));
}
Ändern, wenn dies
public System.Nullable<T> AttributeValue<T>(XmlNode node, string attributeName) where T : struct
{
var value = new object();
if (node.Attributes[attributeName] != null && !string.IsNullOrEmpty(node.Attributes[attributeName].Value))
{
value = node.Attributes[attributeName].Value;
}
else
{
if (typeof(T) == typeof(int))
value = -1;
else if (typeof(T) == typeof(DateTime))
value = DateTime.MinValue;
else if (typeof(T) == typeof(string))
return null;
else if (typeof(T) == typeof(bool))
return null;
}
return (T?)Convert.ChangeType(value, typeof(T));
}
Es fällt für den string-Typ, d.h. Fall 3.3
Freuen uns auf etwas Hilfe.
- Wie nennt man die Methode in deinem ersten code? Müssten Sie nennen, wie
AttributeValue<bool?>(...)
Wenn Sie einfach anrufenAttributeValue<bool>(...)
dannnull
ist kein Gültiger Wert fürbool
. EDIT: Und der zweite Fall nicht, weilstring
können nicht verwendet werdenSystem.Nullable<T>
weilstring
ist kein value-Typ struct.
Du musst angemeldet sein, um einen Kommentar abzugeben.
3,4, die Sie verwenden müssen
bool?
als Typ für T, so können Sie die Rückgabe null.Dann können Sie die
default
Schlüsselwort für 3.3 und 3.4 (string und bool?). Als pro msdn es zurücknull
für Referenz-Typen und der Standardwert für den Wert-Typen (wie int oder bool).Können Sie es verwenden, wie
bool
Fall (3.4) ist, dass es gibtnull
. Dies wird zurückfalse
statt und nicht zu unterscheiden von dem Fall, wo kein entsprechendes Attribut gefunden wird und der Fall, wo "falsche" vorgesehen ist.bool?
als das generische argument, null zurückgeben in diesem Fall? Ich meine, wenn Tbool
Sie können false zurückgeben, so müssen Siebool?
...bool?
ist, wird null zurückgegebenbool
, nichtbool?
. Du hast absolut Recht.Dank für zahlreiche Antworten, dies ist, was ich schrieb und es funktioniert für mich..
Es gibt null für die Arten.
Ich es so nennen
es funktioniert gut für mich. danke Leute...
Müssen Sie rufen Sie Ihren ersten code-set mit
bool?
nichtbool
weilnull
ist kein zulässiger Wert für eine nicht-null-Werte zulässtbool
.Ihre zweite code-block schlägt fehl, weil Sie nicht verwenden können
string
für den generischen Typ derNullable<T>
denn es erfordert einen Wert-Typstruct
undstring
ist ein Referenz-Typ-Klasse.Werden Sie brauchen, um Ihre erste Methode-block zu suchen
typeof(bool?)
und rufen Sie es mit einem nullable-Typ "boolean":Dann nennen, wie:
Müssen Sie auch überprüfen, wie
Convert.ChangeType
funktioniert nicht für ein nullable-Typ. Eine schnelle Lösung aus hier behebt, dass. (es ist im code oben)EDIT: Hier eine bessere/gereinigt-version der Methode:
Können Sie zusätzliche besonderen Fällen für nicht vorhandene Knoten, aber alle Fälle außer
int
bereits der Standardwert für den Typen, so verwenden Sie einfachdefault(T)
statt.