Hey I have an abstract generic type BList<TElement> where TElement : Career. Career is abstract type too.
Given a type T, how do I test if it is a BList type? And how can I cast to the base class? I tried (BList<Career>)object but the compiler was upset. Apparently I can't write BList<Career> because Career is abstract.
There's a bit of ambiguity with your question, so I'll attempt to answer some of the things i think you may be asking...
If you want to check if an instance T is a BList you can just use is:
if (someInstance is BList<Career>)
{
...
}
If you want to see if a generic type parameter is a BList<Career> you can use typeof:
if (typeof(T) == typeof(BList<Career>)
{
...
}
But, if you are just wanting to see if it's any BList<>, you can use reflection:
var t = typeof(T); // or someInstance.GetType() if you have an instance
if (t.IsGenericType && t.GetGenericTypeDefinition() == typeof(BList<>))
{
...
}
Now, as far as how do you cast a BList<TElement> to a BList<Career>? You can't safely.
This has nothing to do with Career being abstract, it has to do with the fact that BList<Career> does not inherit from BList<TElement> even though Career inherits from TElement.
Consider this:
public class Animal { }
public class Dog : Animal { }
public class Cat : Animal { }
Given those, ask yoruself why does this not work:
List<Animal> animals = new List<Cat>();
See the problem? If we allow you to cast a List<Cat> to a List<Animal>, then all of the sudden the Add() method will support Animal instead of Cat, which means you could do this:
animals.Add(new Dog());
Clearly, there is no way we should be able to add a Dog to a List<Cat>. This is why you can't use a List<Cat> as a List<Animal> even though Cat inherits from Animal.
Similar case here.
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