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; }
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" } };
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.)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With