List a class's generic superclasses?
up vote
0
down vote
favorite
I have an inheritance hierarchy:
public interface IValidator<TItem>
public abstract class Validator<TItem, TId> : IValidator<IItem>
public class MyValidator : Validator<MyItem, int>
I want to find every interface and superclass of MyValidator
. I can do the interfaces easily with
return validator.GetType().GetInterfaces();
But when I try the same for superclasses, all I get back is System.Object
, not Validator<MyItem, int>
.
var type = validator.GetType();
return AppDomain.CurrentDomain.GetAssemblies()
.SelectMany(a => a.GetTypes())
.Where(supertype => type.IsSubclassOf(supertype));
How can I get the full inheritance hierarchy?
c# generics inheritance reflection
add a comment |
up vote
0
down vote
favorite
I have an inheritance hierarchy:
public interface IValidator<TItem>
public abstract class Validator<TItem, TId> : IValidator<IItem>
public class MyValidator : Validator<MyItem, int>
I want to find every interface and superclass of MyValidator
. I can do the interfaces easily with
return validator.GetType().GetInterfaces();
But when I try the same for superclasses, all I get back is System.Object
, not Validator<MyItem, int>
.
var type = validator.GetType();
return AppDomain.CurrentDomain.GetAssemblies()
.SelectMany(a => a.GetTypes())
.Where(supertype => type.IsSubclassOf(supertype));
How can I get the full inheritance hierarchy?
c# generics inheritance reflection
2
a.GetTypes()
does not get constructed types. But why are you not usingtypeof(MyValidator).BaseType
?
– PetSerAl
Nov 12 at 3:58
add a comment |
up vote
0
down vote
favorite
up vote
0
down vote
favorite
I have an inheritance hierarchy:
public interface IValidator<TItem>
public abstract class Validator<TItem, TId> : IValidator<IItem>
public class MyValidator : Validator<MyItem, int>
I want to find every interface and superclass of MyValidator
. I can do the interfaces easily with
return validator.GetType().GetInterfaces();
But when I try the same for superclasses, all I get back is System.Object
, not Validator<MyItem, int>
.
var type = validator.GetType();
return AppDomain.CurrentDomain.GetAssemblies()
.SelectMany(a => a.GetTypes())
.Where(supertype => type.IsSubclassOf(supertype));
How can I get the full inheritance hierarchy?
c# generics inheritance reflection
I have an inheritance hierarchy:
public interface IValidator<TItem>
public abstract class Validator<TItem, TId> : IValidator<IItem>
public class MyValidator : Validator<MyItem, int>
I want to find every interface and superclass of MyValidator
. I can do the interfaces easily with
return validator.GetType().GetInterfaces();
But when I try the same for superclasses, all I get back is System.Object
, not Validator<MyItem, int>
.
var type = validator.GetType();
return AppDomain.CurrentDomain.GetAssemblies()
.SelectMany(a => a.GetTypes())
.Where(supertype => type.IsSubclassOf(supertype));
How can I get the full inheritance hierarchy?
c# generics inheritance reflection
c# generics inheritance reflection
asked Nov 12 at 3:38
Hand-E-Food
8,70263270
8,70263270
2
a.GetTypes()
does not get constructed types. But why are you not usingtypeof(MyValidator).BaseType
?
– PetSerAl
Nov 12 at 3:58
add a comment |
2
a.GetTypes()
does not get constructed types. But why are you not usingtypeof(MyValidator).BaseType
?
– PetSerAl
Nov 12 at 3:58
2
2
a.GetTypes()
does not get constructed types. But why are you not using typeof(MyValidator).BaseType
?– PetSerAl
Nov 12 at 3:58
a.GetTypes()
does not get constructed types. But why are you not using typeof(MyValidator).BaseType
?– PetSerAl
Nov 12 at 3:58
add a comment |
1 Answer
1
active
oldest
votes
up vote
1
down vote
accepted
Instead of iterating over each and every type in your assembly you can check base types. Also, you don't need an instance of MyValidator
to get MyValidator
type. Check this code:
var baseType = typeof(MyValidator).BaseType;
var baseTypes = new List<Type> { baseType };
while(baseType != typeof(object))
baseTypes.Add(baseType = baseType.BaseType);
Now baseTypes
list contains Validator<MyItem, int>
and object
types.
what for while loop ?MyValidator
can have only one base class
– Z.R.T.
Nov 12 at 4:05
2
@Z.R.T. sure, but base class ofMyValidator
may have base class too
– vasily.sib
Nov 12 at 4:07
Thank you! I knew it had to be that easy and I somehow missed that one every time.
– Hand-E-Food
Nov 12 at 4:10
add a comment |
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
up vote
1
down vote
accepted
Instead of iterating over each and every type in your assembly you can check base types. Also, you don't need an instance of MyValidator
to get MyValidator
type. Check this code:
var baseType = typeof(MyValidator).BaseType;
var baseTypes = new List<Type> { baseType };
while(baseType != typeof(object))
baseTypes.Add(baseType = baseType.BaseType);
Now baseTypes
list contains Validator<MyItem, int>
and object
types.
what for while loop ?MyValidator
can have only one base class
– Z.R.T.
Nov 12 at 4:05
2
@Z.R.T. sure, but base class ofMyValidator
may have base class too
– vasily.sib
Nov 12 at 4:07
Thank you! I knew it had to be that easy and I somehow missed that one every time.
– Hand-E-Food
Nov 12 at 4:10
add a comment |
up vote
1
down vote
accepted
Instead of iterating over each and every type in your assembly you can check base types. Also, you don't need an instance of MyValidator
to get MyValidator
type. Check this code:
var baseType = typeof(MyValidator).BaseType;
var baseTypes = new List<Type> { baseType };
while(baseType != typeof(object))
baseTypes.Add(baseType = baseType.BaseType);
Now baseTypes
list contains Validator<MyItem, int>
and object
types.
what for while loop ?MyValidator
can have only one base class
– Z.R.T.
Nov 12 at 4:05
2
@Z.R.T. sure, but base class ofMyValidator
may have base class too
– vasily.sib
Nov 12 at 4:07
Thank you! I knew it had to be that easy and I somehow missed that one every time.
– Hand-E-Food
Nov 12 at 4:10
add a comment |
up vote
1
down vote
accepted
up vote
1
down vote
accepted
Instead of iterating over each and every type in your assembly you can check base types. Also, you don't need an instance of MyValidator
to get MyValidator
type. Check this code:
var baseType = typeof(MyValidator).BaseType;
var baseTypes = new List<Type> { baseType };
while(baseType != typeof(object))
baseTypes.Add(baseType = baseType.BaseType);
Now baseTypes
list contains Validator<MyItem, int>
and object
types.
Instead of iterating over each and every type in your assembly you can check base types. Also, you don't need an instance of MyValidator
to get MyValidator
type. Check this code:
var baseType = typeof(MyValidator).BaseType;
var baseTypes = new List<Type> { baseType };
while(baseType != typeof(object))
baseTypes.Add(baseType = baseType.BaseType);
Now baseTypes
list contains Validator<MyItem, int>
and object
types.
edited Nov 12 at 4:08
answered Nov 12 at 3:59
vasily.sib
1,9271919
1,9271919
what for while loop ?MyValidator
can have only one base class
– Z.R.T.
Nov 12 at 4:05
2
@Z.R.T. sure, but base class ofMyValidator
may have base class too
– vasily.sib
Nov 12 at 4:07
Thank you! I knew it had to be that easy and I somehow missed that one every time.
– Hand-E-Food
Nov 12 at 4:10
add a comment |
what for while loop ?MyValidator
can have only one base class
– Z.R.T.
Nov 12 at 4:05
2
@Z.R.T. sure, but base class ofMyValidator
may have base class too
– vasily.sib
Nov 12 at 4:07
Thank you! I knew it had to be that easy and I somehow missed that one every time.
– Hand-E-Food
Nov 12 at 4:10
what for while loop ?
MyValidator
can have only one base class– Z.R.T.
Nov 12 at 4:05
what for while loop ?
MyValidator
can have only one base class– Z.R.T.
Nov 12 at 4:05
2
2
@Z.R.T. sure, but base class of
MyValidator
may have base class too– vasily.sib
Nov 12 at 4:07
@Z.R.T. sure, but base class of
MyValidator
may have base class too– vasily.sib
Nov 12 at 4:07
Thank you! I knew it had to be that easy and I somehow missed that one every time.
– Hand-E-Food
Nov 12 at 4:10
Thank you! I knew it had to be that easy and I somehow missed that one every time.
– Hand-E-Food
Nov 12 at 4:10
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Some of your past answers have not been well-received, and you're in danger of being blocked from answering.
Please pay close attention to the following guidance:
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53255656%2flist-a-classs-generic-superclasses%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
2
a.GetTypes()
does not get constructed types. But why are you not usingtypeof(MyValidator).BaseType
?– PetSerAl
Nov 12 at 3:58