Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is there a way to get a type's alias through reflection?

I'm writing a simple code generation application to build POCO's from a DB2 database schema. I know it doesn't matter, but I prefer to use type aliases rather than the actual system type name if they are available, i.e., "int" rather than "Int32." Is there a way using reflection that I can get a type's alias rather than it's the actual type?

//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; } 
like image 506
AJ. Avatar asked Sep 01 '09 14:09

AJ.


2 Answers

Nope - just create a Dictionary<Type,string> to map all of the types to their aliases. It's a fixed set, so it's not hard to do:

private static readonly Dictionary<Type, string> Aliases =     new Dictionary<Type, string>() {     { 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" } }; 
like image 154
Jon Skeet Avatar answered Oct 07 '22 15:10

Jon Skeet


This doesn't use reflection, strictly speaking, but you can get to the type's alias by using 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 

(Having said that, I think that the other answers suggesting that you just use a mapping from CLR types to C# aliases are probably the best way to go with this one.)

like image 44
LukeH Avatar answered Oct 07 '22 14:10

LukeH