2

我有一堂课。

DataMapper<TDalType, TFieldType> : DataMapperBase

对于一个特定的实体,我有一个

ObjectADataMapper<TFieldType> : DataMapper<ObjectADal, TFieldType>

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

4

3 回答 3

6

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

var type = obj.GetType();
bool isObjectADataMapper = type.IsGenericType && type.GetGenericTypeDefinition() == typeof(ObjectADataMapper<>);

或者,以可重复使用的方式

  bool IsInstanceOfGenericTypeClosingTemplate(object obj, Type genericTypeDefinition){ 
      if(obj == null) throw new ArgumentNullException("obj");
      if(genericTypeDefinition== null) throw new ArgumentNullException("genericTypeDefinition");
      if(!genericTypeDefinition.IsGenericTypeDefinition) throw new ArgumentException("Must be a generic type definition.", "genericTypeDefinition");
      Type type = obj.GetType(); 
      return type.IsGenericType && type.GetGenericTypeDefinition() == genericTypeDefinition;
  }

您甚至可以更进一步,看看该类型是否派生自相关的泛型类型定义。例如,假设您有:

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

在这种情况下,我提供的方法会失败。所以你必须做类似的事情

  bool IsInstanceOfGenericTypeClosingTemplateOrSubclassThereof(object obj, Type genericTypeDefinition){ 
      if(obj == null) throw new ArgumentNullException("obj");
      if(genericTypeDefinition== null) throw new ArgumentNullException("genericTypeDefinition");
      if(!genericTypeDefinition.IsGenericTypeDefinition) throw new ArgumentException("Must be a generic type definition.", "genericTypeDefinition");

      Type type = obj.GetType();
      while ( type != typeof(object) )
      {
         if(type.IsGenericType && type.GetGenericTypeDefinition() == genericTypeDefinition) 
         {
            return true;
         }
         type = type.BaseType;
      } 
      return false;
  }
于 2013-05-03T20:20:12.820 回答
0

你需要得到一个这样的类型的实例:

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());
}
于 2013-05-03T20:27:36.317 回答
-1

您可以使用is

if(obj is DataMapper)
{

}
于 2013-05-03T20:17:48.753 回答