Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

IsAssignableFrom, IsInstanceOfType and the is keyword, what is the difference?

Tags:

c#

casting

c#-4.0

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?

like image 214
amiry jd Avatar asked Apr 06 '13 16:04

amiry jd


2 Answers

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).

like image 124
Jacob Avatar answered Oct 11 '22 15:10

Jacob


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()); } 
like image 39
Matthew Watson Avatar answered Oct 11 '22 15:10

Matthew Watson