Ich habe eine Erweiterungsmethode zum sicheren Gussobjekte, die wie folgt aussieht:IsAssignableFrom, IsInstanceOfType und das Schlüsselwort is, was ist der Unterschied?
public static T SafeCastAs<T>(this object obj) {
if (obj == null)
return default(T);
// which one I should use?
// 1. IsAssignableFrom
if (typeof(T).IsAssignableFrom(obj.GetType()))
return (T)obj;
// 2. IsInstanceOfType
if (typeof(T).IsInstanceOfType(obj))
return (T) obj;
// 3. is operator
if (obj is T)
return (T) obj;
return default(T);
}
Wie Sie sehen können, habe ich 3 Wahl, so das man sollte ich verwenden? Was ist eigentlich der Unterschied zwischen IsAssignableFrom
, IsInstanceOfType
und is
Operator?
Ich bin mir nicht sicher, Ihre Behauptung hier ist richtig. 'typeof (int)' gibt ein Objekt vom Typ 'Type' zurück, so dass die erste Anweisung fehlschlägt, da dieses' Type'-Objekt offensichtlich kein 'int' ist. Wenn Sie jedoch die erste Anweisung in 'a.GetType() ändern. IsInstanceOfType (3)' wird True zurückgegeben. Ich denke, dass Sie "IsInstanceOfType" falsch hier verwenden. –
@JeffBridgman wahr, meine Vermutung Ich habe gerade versucht, den Unterschied der Verwendung dieser beiden Methoden zu zeigen, etwas wie '' ' Console.WriteLine (typeof (int?). IsInstanceOfType (null)); Console.WriteLine (typeof (int?). IsInstanceOfType (1)); Console.WriteLine (typeof (int?). IsAssignableFrom (typeof (int))); '' ' Ich werde einige Teile dieser Antwort entfernen. – outcoldman