I have an extension method to safe casting objects, that looks like this:
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); }
As you can see, I have 3 choice, so which one I should to use? Actually what is the difference between IsAssignableFrom
, IsInstanceOfType
, and is
operator?
You use whatever you have the information for.
If you have an instance and a static type you want to check against, use is
.
If you don't have the static type, you just have a Type
object, but you have an instance you want to check, use IsInstanceOfType
.
If you don't have an instance and you just want to check the compatibility between a theoretical instance of a Type
and another Type
, use IsAssignableFrom
.
But really is seems like you are just re-implementing the as operator (except that yours would also work for non-nullable value types, which is usually not a big limitation).
I guess you're effectively implementing a version of the as
operator that works with value types as well as reference types.
I'd go for:
public static T SafeCastAs<T>(this object obj) { return (obj is T) ? (T) obj : default(T); }
IsAssignableFrom
works with types, and is
works with instances. They will give you the same results in your case, so you should use the simplest version IMHO.
As for IsInstanceOfType
:That is implemented in terms of IsAssignableFrom
, so there will be no difference.
You can prove that by using Reflector to look at the definition of IsInstanceOfType()
:
public virtual bool IsInstanceOfType(object o) { if (o == null) { return false; } return this.IsAssignableFrom(o.GetType()); }
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With