';System.Type';不包含';GenericTypeArguments';使用(动态)

本文关键字:使用 动态 System Type 包含 GenericTypeArguments | 更新日期: 2023-09-27 18:00:29

我正在尝试使用获取动态linq列的类型

var args = ((dynamic)linqColumn).PropertyType.GenericTypeArguments;

然后比较可能的类型名称:

if (args.Length > 0 && args[0].Name == "DateTime")
    ProcessDateTimeType();
else if (args.Length > 0 && args[0].Name == "Double")
    ProcessDoubleType();

这适用于带有.NET 4.0的Windows Vista,但不适用于带有NET 4.0的Windows Server 2003。抛出错误'System.Type' does not contain a definition for 'GenericTypeArguments'

我只需要用于可为null的类型的GenericTypeArguments。

知道吗?

备注

  • 通过var linqColumn = linqTableType.GetProperty("COLNAME");获得linqColumn
  • linqTableType通过'Type linqTableType = Type.GetType("MYNAMESPACE." + "TABLENAME");获得
  • 代码在内部执行web服务

';System.Type';不包含';GenericTypeArguments';使用(动态)

正如Preston在评论中提到的,GenericTypeArguments属性是在.NET 4.5中添加的。

4.5是对4.0的就地升级;即使您的目标是4.0,当您使用反射或dynamic时,4.5 API仍然可以工作。

尝试将dynamic代码限制为仅检索属性类型的部分;从那时起,您知道该值是Type,因此可以使用早期绑定:

Type propertyType = ((dynamic)linqColumn).PropertyType;
// Visual Studio should now warn you if you try to use:
// var args = propertyType.GenericTypeArguments;
var args = propertyType.IsGenericType && !propertyType.IsGenericTypeDefinition
    ? propertyType.GetGenericArguments()
    : Type.EmptyTypes;