Tôi có một phương pháp mở rộng cho đối tượng đúc an toàn, trông như thế này:IsAssignableFrom, IsInstanceOfType và từ khóa là gì, sự khác biệt là gì?
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);
}
Như bạn thấy, tôi có 3 sự lựa chọn, vì vậy mà một trong tôi nên sử dụng không? Trên thực tế sự khác nhau giữa các nhà cung cấp IsAssignableFrom
, IsInstanceOfType
và is
là gì?
Tôi không chắc chắn khẳng định của bạn ở đây là chính xác. 'typeof (int)' trả về một đối tượng kiểu 'Type' để câu lệnh đầu tiên sẽ thất bại vì đối tượng' Type' rõ ràng không phải là 'int'. Tuy nhiên, nếu bạn thay đổi câu lệnh đầu tiên thành 'a.GetType(). IsInstanceOfType (3)' nó sẽ trả về true. Tôi nghĩ rằng bạn đang sử dụng 'IsInstanceOfType' sai ở đây. –
@ JeffBridgman đúng, tôi đoán tôi chỉ cố gắng để hiển thị sự khác biệt của việc sử dụng hai phương pháp, một cái gì đó như '' ' Console.WriteLine (typeof (int?). IsInstanceOfType (null)); Console.WriteLine (typeof (int?). IsInstanceOfType (1)); Console.WriteLine (typeof (int?). IsAssignableFrom (typeof (int))); '' ' Tôi sẽ xóa một số phần của câu trả lời này. – outcoldman