Mam metodę rozszerzenia do bezpiecznych obiektów odlewniczych, które wygląda następująco:IsAssignableFrom, IsInstanceOfType i jest słowem kluczowym, jaka jest różnica?
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);
}
Jak widać, mam 3 wybór, więc który z nich powinienem użyć? Czym właściwie różni się operator IsAssignableFrom
, IsInstanceOfType
i is
?
Nie jestem pewien, czy twoje stwierdzenie tutaj jest poprawne. 'typeof (int)' zwraca obiekt typu 'Type', więc pierwsza instrukcja zakończy się niepowodzeniem, ponieważ obiekt' Type' nie jest oczywiście 'int'. Jednak jeśli zmienisz pierwszą instrukcję na 'a.GetType(). IsInstanceOfType (3)' zwróci ona true. Myślę, że używasz tutaj "IsInstanceOfType". –
@JeffBridgman prawda, zgaduję, że próbowałem pokazać różnicę w użyciu tych dwóch metod, coś w rodzaju '' ' Console.WriteLine (typeof (int?). IsInstanceOfType (null)); Console.WriteLine (typeof (int?). IsInstanceOfType (1)); Console.WriteLine (typeof (int?). IsAssignableFrom (typeof (int))); '' ' Zamierzam usunąć niektóre części tej odpowiedzi. – outcoldman