2

我正在尝试序列化一个对象,并想知道某个类型是否可以由XmlReader.ReadElementContentAsObject()或 使用ReadElementContentAs()

我可以询问一个类型是否是 CLR 类型,以便我知道我可以将它传递给这些方法吗?

if(myType.IsCLRType) // how can I find this property?
    myValue = _cReader.ReadElementContentAsObject();
4

3 回答 3

3

我想我正在寻找这个列表:http: //msdn.microsoft.com/en-us/library/xa669bew.aspx

您可能可以通过 获得大部分方法Type.GetTypeCode(type),但坦率地说,我希望您最好的选择更简单:

static readonly HashSet<Type> supportedTypes = new HashSet<Type>(
    new[] { typeof(bool), typeof(string), typeof(Uri), typeof(byte[]), ... });

并检查supportedTypes.Contains(yourType)

没有神奇的预定义列表可以完全匹配您心目中的“此列表”。例如,TypeCode不记byte[]Uri.

于 2013-03-08T10:37:47.110 回答
1

也许是这样;如果您将 CLR 类型定义为 System Core 类型。

错了我就删

public static class TypeExtension
{
    public static bool IsCLRType(this Type type)
    {
        var fullname = type.Assembly.FullName;
        return fullname.StartsWith("mscorlib");
    }
}

或者;

    public static bool IsCLRType(this Type type)
    {
        var definedCLRTypes = new List<Type>(){
                typeof(System.Byte),
                typeof(System.SByte),
                typeof(System.Int16),
                typeof(System.UInt16),
                typeof(System.Int32),
                typeof(System.UInt32),
                typeof(System.Int64),
                typeof(System.UInt64),
                typeof(System.Single),
                typeof(System.Double),
                typeof(System.Decimal),
                typeof(System.Guid),
                typeof(System.Type),
                typeof(System.Boolean),
                typeof(System.String),
                /* etc */
            };
        return definedCLRTypes.Contains(type);
    }
于 2013-03-08T10:32:15.573 回答
1
bool isDotNetType = type.Assembly == typeof(int).Assembly;
于 2013-03-08T10:35:58.123 回答