mardi 15 décembre 2020

Decide if class has generic ancestor of specific generic argument type

Say I have a class CoolStorageClass, which inherits from StorageClassBase:

public abstract class StorageClassBase
{
//does something
}

public class CoolStorageClass : StorageClassBase
{
}

Then I have a generic abstract BaseClass<T> (which implements interface IBase<T>, which is probably not important for the question). It is important, that T can only be of type StorageClassBase.

public abstract class BaseClass<T> : IBase<T> where T : StorageClassBase
{
}

Then I have the implementation of the BaseClass with T as CoolStorageClass in the form of CoolClass:

public class CoolClass : BaseClass<CoolStorageClass>
{
}

I want to select all of my object, which are implementing the BaseClass<StorageClassBase> abstract class.

  1. does it make sense to check the generic of BaseClass? I mean, I could have classes, which inherit from BaseClass<DifferentStorageClassBase>...

  2. how do I check if a Type implements BaseClass<StorageClassBase>? I have found following [answer][1], but it does not check the type of the generic parameter. So I modified it into this:

    public static class TypeExtensions
    {
        //https://stackoverflow.com/a/457708
        public static bool HasBaseClassOf(this Type t, Type toCheck, Type genericParameter)
        {
            while ((t != null) && (t != typeof(object)))
            {
                var cur = t.IsGenericType ? t.GetGenericTypeDefinition() : t;
                if (toCheck == cur)
                {
                    //also check whether the generic types match
                    if (t.GenericTypeArguments[0].IsSubclassOf(genericParameter))
                    {
                        return true;
                    }
                }
                t = t.BaseType;
            }
    
            return false;
        }
    }
    

But this only checks for one generic type, and I don't understand why I have to check t.GenericTypeArguments instead of cur.GenericTypeArguments.

  1. What is the correct way to check for all the generic type arguments and the BaseClass?

  2. Currently I have to call the function like this: o.GetType().HasBaseClassOf(typeof(ProxyBase<>), typeof(ProxyDataPointBase)). How should I modify the function to be able to call it like this: o.GetType().HasBaseClassOf(typeof(ProxyBase<ProxyDataPointBase>))? [1]: https://stackoverflow.com/a/457708





Aucun commentaire:

Enregistrer un commentaire