What is the C# equivalent to Java's isInstance()?
Asked Answered
P

5

95

I know of is and as for instanceof, but what about the reflective isInstance() method?

Putrescible answered 11/11, 2008 at 23:9 Comment(0)
B
57

The equivalent of Java’s obj.getClass().isInstance(otherObj) in C# is as follows:

bool result = obj.GetType().IsAssignableFrom(otherObj.GetType());

Note that while both Java and C# work on the runtime type object (Java java.lang.Class ≣ C# System.Type) of an obj (via .getClass() vs .getType()), Java’s isInstance takes an object as its argument, whereas C#’s IsAssignableFrom expects another System.Type object.

Brouwer answered 11/11, 2008 at 23:13 Comment(5)
Note IsAssignableFrom takes a Type, not an object, so you need to actually do OtherObj.getType().Sulk
Thanks Jon – and remember, this is a wiki! I don't resent people correcting my mistakes.Brouwer
interesting... in java, the JVM treats "instanceof" specially, apparently its very very fast, which may explain why its unusually a keyword (there is also an isAssignable method in java).Nawab
Why is this method better then the "is" operator which is more readable?Overbuild
@TimothyGonzalez Because it does something different. It tests whether two variables have the same type. is required a type name, by contrast. This is what OP wanted: the equivalent of Java's isInstance. The other answer is simply wrong despite the ridiculous number of upvotes.Brouwer
C
193
bool result = (obj is MyClass); // Better than using 'as'
Crosswise answered 12/11, 2008 at 5:12 Comment(2)
Does it work even for classes that use inheritance? (new Child() is Parent)Eternalize
tested here, it works for classes that user inheritance. Thanks man.Segovia
B
57

The equivalent of Java’s obj.getClass().isInstance(otherObj) in C# is as follows:

bool result = obj.GetType().IsAssignableFrom(otherObj.GetType());

Note that while both Java and C# work on the runtime type object (Java java.lang.Class ≣ C# System.Type) of an obj (via .getClass() vs .getType()), Java’s isInstance takes an object as its argument, whereas C#’s IsAssignableFrom expects another System.Type object.

Brouwer answered 11/11, 2008 at 23:13 Comment(5)
Note IsAssignableFrom takes a Type, not an object, so you need to actually do OtherObj.getType().Sulk
Thanks Jon – and remember, this is a wiki! I don't resent people correcting my mistakes.Brouwer
interesting... in java, the JVM treats "instanceof" specially, apparently its very very fast, which may explain why its unusually a keyword (there is also an isAssignable method in java).Nawab
Why is this method better then the "is" operator which is more readable?Overbuild
@TimothyGonzalez Because it does something different. It tests whether two variables have the same type. is required a type name, by contrast. This is what OP wanted: the equivalent of Java's isInstance. The other answer is simply wrong despite the ridiculous number of upvotes.Brouwer
T
39

Depends, use is if you don't want to use the result of the cast and use as if you do. You hardly ever want to write:

if(foo is Bar) {
    return (Bar)foo;
}

Instead of:

var bar = foo as Bar;
if(bar != null) {
    return bar;
}
Terranceterrane answered 12/11, 2008 at 5:30 Comment(0)
T
2

just off the top of my head, you could also do:

bool result = ((obj as MyClass) != null)

Not sure which would perform better. I'll leave it up to someone else to benchmark :)

Timberlake answered 12/11, 2008 at 1:10 Comment(0)
L
2

Below code can be alternative to IsAssignableFrom.

parentObject.GetType().IsInstanceOfType(inheritedObject)

See Type.IsInstanceOfType description in MSDN.

Laurice answered 28/12, 2015 at 12:52 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.