gpt4 book ai didi

c# - 如何识别对象是否属于基本通用类型?

转载 作者:行者123 更新时间:2023-12-02 05:05:13 25 4
gpt4 key购买 nike

我有课。

DataMapper<TDalType, TFieldType> : DataMapperBase

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

ObjectADataMapper<TFieldType> : DataMapper<ObjectADal, TFieldType>

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

最佳答案

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

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;
}

关于c# - 如何识别对象是否属于基本通用类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16366860/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com