我正在尝试返回一个派生自泛型类型和特定接口的类型,但我不关心泛型类参数在基类上是什么。这是具体类型:
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
。
有办法做到这一点吗?
答案 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
是接口类型,它与问题没有任何关系。