如何确定对象是值类型

4

在 .net 4.5 中,我可以使用 Type.IsValueType 来以直观的方式解决这个问题。然而,当我创建使用可移植库的通用应用程序时,它没有任何等效方法来查找类型是否为值类型。

还有其他什么技巧可以解决这个问题吗?


这里说它支持便携式库:http://msdn.microsoft.com/en-us/library/system.type.isvaluetype(v=vs.110).aspx - bit
你想编写一个可在其他项目中使用的 DLL 吗? - Deepak Sharma
1
它说它被支持,但是当我编写通用应用程序时,在System命名空间的Type类中找不到该属性:错误1:'System.Type'不包含'isValueType'的定义,并且没有接受类型为'System.Type'的第一个参数的扩展方法'isValueType'可以找到(您是否缺少使用指令或程序集引用?) - sargeMonkey
@sargeMonkey:这是大写字母I的IsValueType. - leppie
IsValueType 有什么问题吗? - abatishchev
IsValueType在Windows Runtime 8.1中不可用,因此我无法在通用应用程序中使用它。 - sargeMonkey
2个回答

5
尝试使用 type.GetTypeInfo().IsValueType。同时确保你已经添加了对 System.Reflection 的 using 语句,这样扩展方法 GetTypeInfo() 才能可用。

它在Windows 8.1运行时不可用。 - sargeMonkey
1
@sargeMonkey 你为什么认为它不存在?我创建了一个新的空白通用应用程序,将一个类添加到共享项目中,并在添加了 using System.Reflection; 语句后能够访问 typeof(object).GetTypeInfo().IsValueType - Daniel Plaisted
尝试将一个.NET 4库项目添加到解决方案中,看看上面的代码是否有效...我应该早点提到,这就是我卡住的地方。 - sargeMonkey
@sargeMonkey 在一个.NET 4库项目中,IsValueType直接在Type上可用(即您不需要调用GetTypeInfo)。但是您无法从Windows 8.1应用程序引用.NET 4项目。您是否尝试将同一文件链接到两个项目中?还是使用针对.NET 4的PCL?或者发生了什么事情? - Daniel Plaisted
无论哪种方式都会导致这个问题。您可以添加一个面向Windows 8.1的PCL,并在那里添加相同的代码,这可能会导致此问题。我正在编写一个使用共享PCL针对多个平台的库。.net 4 win 8.1运行时目标不会给我Type.IsValueType或Type.GetTypeInfo()。IsValueType。 - sargeMonkey

1
一种我找到的解决方法是:

typeof(ValueType).IsAssignableFrom(type)


这个能用吗?我认为所有东西都是从System.Object派生的。 - Arturo Torres Sánchez
1
对不起,复制粘贴中有错误 :) 现在已经修复了。 - sargeMonkey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接