27

I want to do something like this:

class SomeClass<T>
{
   SomeClass()
   {
        bool IsInterface = T is ISomeInterface;
   }
}

What is the best way for something like this?

Note: I am not looking to constrain T with a where, but I would like my code to be aware of what types of interfaces T implements. I would prefer that I don't have to construct a T.

2
  • 13
    If you're checking types in a generic method/class, IMO something is wrong. Commented Feb 19, 2010 at 20:13
  • 2
    I don't want to have 3 separate descendants of SomeClass. I want some class to certain things depending if T has something. Commented Feb 19, 2010 at 20:18

6 Answers 6

33

I don't think you can use the is operator for this. But you can use IsAssignableFrom:

bool IsInterface = typeof(ISomeInterface).IsAssignableFrom(typeof(T));
Sign up to request clarification or add additional context in comments.

Comments

9

should use following instead

 bool IsInterface = typeof(ISomeInterface).IsAssignableFrom(typeof(T));

is operator

is operator is used to check whether the run-time type of an object is compatible with a given type.

An expression where the use of is conforms to the syntax, evaluates to true, if both of the following conditions are met:

  • expression is not null.
  • expression can be cast to type. That is, a cast expression of the form (type)(expression) will complete without throwing an exception. For more information, see 7.6.6 Cast expressions.

References

Comments

1

You can use IsAssignableFrom:

  class SomeClass<T>
  {
     SomeClass()
     {
        bool IsIComparable = typeof(IComparable).IsAssignableFrom(typeof(T));
     }
  } 

Comments

1
bool IsInterface = typeof(ISomeInterface).IsAssignableFrom(typeof(T))

Comments

0

I believe the best you can do it:

bool IsInterface = typeof(ISomeInterface).IsAssignableFrom(typeof(T));

Comments

0

You could try doing something like

Type Ttype = typeof(T);

That will give you the full power of the Type class, which has functions like "FindInterfaces".

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.