获取从泛型类型派生的具体类型,而不管泛型类型参数如何

时间:2013-12-06 15:48:56

标签: c#

我正在尝试返回一个派生自泛型类型和特定接口的类型,但我不关心泛型类参数在基类上是什么。这是具体类型:

public class TrackerJobData : DataAccessLayerBase<ProdDataDataContext>, ITrackerJobData

这是我尝试获取具体类型的查询:

Type foundType = (from type in assembly.GetTypes()
                  where type.GetInterfaces().Contains(typeof(T))
                     && type.IsSubclassOf(typeof(DataAccessLayerBase))
                  select type).FirstOrDefault();

问题是foundType总是null

有办法做到这一点吗?

2 个答案:

答案 0 :(得分:2)

您可以创建一个递归函数,通过手动向上DataAccessLayerBase<T>来检查某个类是否从某个T派生Type.BaseType

static bool IsDataAccessLayer(Type type)
{
    if (type == null)
        throw new ArgumentNullException("type");

    return (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(DataAccessLayerBase<>))
        || (type.BaseType != null && IsDataAccessLayer(type.BaseType));
}

答案 1 :(得分:0)

由于我的基类是在配置文件中指定的,因此设置为:

<add key="dataAccessBaseClass" value="Company.Core.Components.Data.L2S.DataAccessLayerBase`1[], Company.Core.Components"/>

注意空括号[]。这表示泛型类,但未指定类型。我通过反复试验发现了这一点。

以下是实施:

Type dataAccessBaseClass = Type.GetType(_dataAccessBaseClass);

Type foundType = (from type in assembly.GetTypes()
                  where type.GetInterfaces().Contains(typeof(T))                                         
                  && type.BaseType.Name.LeftOf('`') == dataAccessBaseClass.Name.LeftOf('`')
                  select type).FirstOrDefault();

_dataAccessBaseClass是配置文件中的字符串 T是接口类型,它与问题没有任何关系。