通过反射获得.Net相应类型的C#类型

时间:2009-09-22 12:59:27

标签: c# .net reflection types

是否有一个函数,给定一个C#类型的字符串表示,返回相应的.Net类型或.Net类型的字符串表示;或以任何方式实现这一目标。

例如:

“bool” - > System.Boolean或“System.Boolean”

“int” - > System.Int32或“System.Int32”

...

感谢。

编辑:真的很遗憾,它不是我希望的“类型到类型”映射,而是“字符串到字符串”映射或“字符串到类型”映射。

3 个答案:

答案 0 :(得分:6)

list of built-in types in C#很短,不太可能改变,所以我认为使用字典或大switch语句来映射这些语句应该不难维护。

如果你想支持可空类型,我相信除了解析输入字符串之外别无选择:

static Type GetTypeFromNullableAlias(string name)
{
    if (name.EndsWith("?"))
        return typeof(Nullable<>).MakeGenericType(
            GetTypeFromAlias(name.Substring(0, name.Length - 1)));
    else
        return GetTypeFromAlias(name);
}

static Type GetTypeFromAlias(string name)
{
    switch (name)
    {
        case "bool": return typeof(System.Boolean);
        case "byte": return typeof(System.Byte);
        case "sbyte": return typeof(System.SByte);
        case "char": return typeof(System.Char);
        case "decimal": return typeof(System.Decimal);
        case "double": return typeof(System.Double);
        case "float": return typeof(System.Single);
        case "int": return typeof(System.Int32);
        case "uint": return typeof(System.UInt32);
        case "long": return typeof(System.Int64);
        case "ulong": return typeof(System.UInt64);
        case "object": return typeof(System.Object);
        case "short": return typeof(System.Int16);
        case "ushort": return typeof(System.UInt16);
        case "string": return typeof(System.String);
        default: throw new ArgumentException();
    }
}

测试:

GetTypeFromNullableAlias("int?").Equals(typeof(int?)); // true

答案 1 :(得分:3)

你的问题并不完全清楚:我不确定你为C#别名提供了什么形式。如果您在编译时知道它,可以正常使用typeof() - C#别名实际上只是 别名,所以typeof(int) == typeof(System.Int32)。发出的代码中存在 no 差异。

如果你有一个字符串,例如"int",只需制作一张地图:

Dictionary<string,Type> CSharpAliasToType = new Dictionary<string,Type>
{
    { "string", typeof(string) },
    { "int", typeof(int) },
    // etc
};

获得Type后,您可以获得全名,装配等。

以下是一些考虑可空类型的示例代码:

public static Type FromCSharpAlias(string alias)
{
    bool nullable = alias.EndsWith("?");
    if (nullable)
    {
        alias = alias.Substring(0, alias.Length - 1);
    }
    Type type;
    if (!CSharpAliasToType.TryGetValue(alias, out type))
    {
         throw new ArgumentException("No such type");
    }
    return nullable ? typeof(Nullable<>).MakeGenericType(new Type[]{ type })
                    : type;
}

答案 2 :(得分:1)

不要太复杂。

typeof(bool).ToString()
typeof(string).ToString()
typeof(int).ToString()
typeof(char).ToString()

...