2015-06-30 17 views
0

我试图用“的System.Type”不包含定义与“GenericTypeArguments”(动态)

​​

然后在可能的类型名进行比较来获得一个动态的LINQ列的类型:

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'

我只需要GenericTypeArguments可为空类型。

有什么想法?

备注

  • linqColumn经由var linqColumn = linqTableType.GetProperty("COLNAME");
  • linqTableType获得经由'Type linqTableType = Type.GetType("MYNAMESPACE." + "TABLENAME");
  • 代码被内部 作为普雷斯顿评价提到执行的Web服务
+0

https://msdn.microsoft.com/en-us/library/system.type.getgenericarguments(v= vs.100).aspx - 在Windows Server 2003 SP2上受支持 - 检查您是否安装了SP2 – Charleh

+2

“GenericTypeArguments”没有添加到“System.Type”中,直到.Net 4.5。 https://msdn.microsoft.com/en-us/library/system.type.generictypearguments(v=vs.110).aspx –

+0

其实是的普雷斯顿是正确的,我在看GetGenericArguments - 你确定你正在为Vista上的.NET 4.0? – Charleh

回答

1

获得,在.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; 
+0

谢谢,因为只需要可空类型(Nullable''1 DateTime,...),所以使用'Nullable.GetUnderlyingType(linqColumn.PropertyType)'也可以。 – Yahia

相关问题