C# 如何识别对象是否为基泛型类型?

C# 如何识别对象是否为基泛型类型?,c#,generics,inheritance,C#,Generics,Inheritance,我有课 DataMapper<TDalType, TFieldType> : DataMapperBase DataMapper:DataMapperBase 对于特定实体,我有一个 ObjectADataMapper<TFieldType> : DataMapper<ObjectADal, TFieldType> ObjectADataMapper:DataMapper 然后,我有一个DataMapperBase实例,需要确定它是否是ObjectAD

我有课

DataMapper<TDalType, TFieldType> : DataMapperBase
DataMapper:DataMapperBase
对于特定实体,我有一个

ObjectADataMapper<TFieldType> : DataMapper<ObjectADal, TFieldType>
ObjectADataMapper:DataMapper

然后,我有一个DataMapperBase实例,需要确定它是否是ObjectADataMapper版本的实体(具有任何TFieldType值)。

您可以使用
is

if(obj is DataMapper)
{

}

您可以通过查看对象的类型是否为泛型以及相应的泛型模板是否为您要查找的泛型模板来检查这一点。例如:

var type = obj.GetType();
bool isObjectADataMapper = type.IsGenericType && type.GetGenericTypeDefinition() == typeof(ObjectADataMapper<>);
您甚至可以进一步了解这一点,看看该类型是否派生自相关的泛型类型定义。例如,考虑到你有:

  public class StringDataMapper : ObjectADataMapper<string>
  { 
     // .... whatever
  }

您需要获得如下类型的实例:

var typeToTestFor = typeof(ObjectADataMapper<>);
你们可以一起做以下事情

public bool IsObjectADataMapper(DataMapperBase base) {
  var typeUnderTest = base.GetType();
  if (!typeUnderTest.IsGenericType())
    return false; // its not generic so it can't match
  var typeToTestFor = typeof(ObjectADataMapper<>);
  return typeToTestFor.Equals(typeUnderTest.GetGenericTyepDefinition());
}
public bool IsObjectADataMapper(DataMapperBase){
var typeUnderTest=base.GetType();
如果(!typeUnderTest.IsGenericType())
return false;//它不是泛型,因此无法匹配
var typeToTestFor=typeof(ObjectADataMapper);
返回typeToTestFor.Equals(typeUnderTest.GetGenericTypeDefinition());
}

这行不通,因为我需要知道它是否是ObjectADataMapper的版本,而不是任何数据映射程序。它可以是ObjectBDataMapper或ObjectCDataMapper(或任何其他对象),在这种情况下检查应该失败。如果您有
派生ObjectADataMapper:ObjectADataMapper
,该怎么办,您是否仍希望获取此信息,还是只希望直接引用
ObjectADataMapper
?@ChrisSinclair-我认为不应该有额外的派生级别,然而,任何级别的推导都可能会起作用。可能的副本我已经投票决定将此作为我先前发现的其他副本关闭,但不确定如何使用。我忽略了这样一个事实,即我可以执行类似于“typeof(ObjectADataMapper)”的操作。@ChrisSinclair,“聪明”的方法是使用一个抽象的非泛型基和一个
internal
ctor,并且只让所讨论的泛型定义继承自它。然后可以执行
is ObjectADataMapperBase
,并安全地知道任何具体类型都必须实现泛型
ObjectADataMapper
。或者,您可以使用元数据(例如,使用
内部
属性,用该属性修饰泛型类型定义,并编写一个公共扩展方法,告知类型是否具有该属性。)
var typeToTestFor = typeof(ObjectADataMapper<>);
var typeOfObject being tested = objectBeingTested.GetType().GetGenericTypeDefinition();
public bool IsObjectADataMapper(DataMapperBase base) {
  var typeUnderTest = base.GetType();
  if (!typeUnderTest.IsGenericType())
    return false; // its not generic so it can't match
  var typeToTestFor = typeof(ObjectADataMapper<>);
  return typeToTestFor.Equals(typeUnderTest.GetGenericTyepDefinition());
}