当前位置:  开发笔记 > 编程语言 > 正文

有没有办法通过反射获得类型的别名?

如何解决《有没有办法通过反射获得类型的别名?》经验,为你挑选了3个好方法。

我正在编写一个简单的代码生成应用程序来从DB2数据库模式构建POCO.我知道这没关系,但我更喜欢使用类型别名而不是实际的系统类型名称(如果它们可用),即"int"而不是"Int32".有没有办法使用反射,我可以得到一个类型的别名,而不是它的实际类型?

//Get the type name
var typeName = column.DataType.Name;

//If column.DataType is, say, Int64, I would like the resulting property generated
//in the POCO to be...

public long LongColumn { get; set; }

//rather than what I get now using the System.Reflection.MemberInfo.Name property:

public Int64 LongColumn { get; set; }

提前致谢.



1> Jon Skeet..:

不 - 只需创建一个Dictionary将所有类型映射到其别名.这是一个固定的集合,因此不难做到:

private static readonly Dictionary Aliases =
    new Dictionary()
{
    { typeof(byte), "byte" },
    { typeof(sbyte), "sbyte" },
    { typeof(short), "short" },
    { typeof(ushort), "ushort" },
    { typeof(int), "int" },
    { typeof(uint), "uint" },
    { typeof(long), "long" },
    { typeof(ulong), "ulong" },
    { typeof(float), "float" },
    { typeof(double), "double" },
    { typeof(decimal), "decimal" },
    { typeof(object), "object" },
    { typeof(bool), "bool" },
    { typeof(char), "char" },
    { typeof(string), "string" },
    { typeof(void), "void" }
};



2> LukeH..:

严格来说,这不使用反射,但您可以使用CodeDOM来获取类型的别名:

Type t = column.DataType;    // Int64

string typeName;
using (var provider = new CSharpCodeProvider())
{
    var typeRef = new CodeTypeReference(t);
    typeName = provider.GetTypeOutput(typeRef);
}

Console.WriteLine(typeName);    // long

(话虽如此,我认为其他答案表明你只使用从CLR类型到C#别名的映射可能是最好的方法.)



3> 小智..:

如果有人需要带有nullables的字典:

private static readonly Dictionary Aliases = new Dictionary()
    {
        { typeof(byte), "byte" },
        { typeof(sbyte), "sbyte" },
        { typeof(short), "short" },
        { typeof(ushort), "ushort" },
        { typeof(int), "int" },
        { typeof(uint), "uint" },
        { typeof(long), "long" },
        { typeof(ulong), "ulong" },
        { typeof(float), "float" },
        { typeof(double), "double" },
        { typeof(decimal), "decimal" },
        { typeof(object), "object" },
        { typeof(bool), "bool" },
        { typeof(char), "char" },
        { typeof(string), "string" },
        { typeof(void), "void" },
        { typeof(Nullable), "byte?" },
        { typeof(Nullable), "sbyte?" },
        { typeof(Nullable), "short?" },
        { typeof(Nullable), "ushort?" },
        { typeof(Nullable), "int?" },
        { typeof(Nullable), "uint?" },
        { typeof(Nullable), "long?" },
        { typeof(Nullable), "ulong?" },
        { typeof(Nullable), "float?" },
        { typeof(Nullable), "double?" },
        { typeof(Nullable), "decimal?" },
        { typeof(Nullable), "bool?" },
        { typeof(Nullable), "char?" }
    };

推荐阅读
mobiledu2402851173
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有