I’m generating code in a visual studio extension using CodeDom and plain code strings. My extension reads a current classes declared fields and properties using reflection and generates contructors, initializers, implements certain interfaces, etc.
The generator class is simple:
public class CodeGenerator < T >
{
public string GetCode ()
{
string code = "";
T type = typeof(T);
List < PropertyInfo > properties = t.GetProperties();
foreach (PropertyInfo property in properties)
code += "this." + property.Name + " = default(" + property.PropertyType.Name + ")";
}
}
I’m stuck at field and property initializers in two ways.
Firstly, although default(AnyNonGenericValueOrReferenceType) seems to work in most cases, I’m uncomfortable with using it in generated code.
Secondly, it does not work for generic types since I can’t find a way to get the underlying type of the generic type. So if a property is List < int >, property.PropertyType.Name returns List`1. There are two problems here. First, I need to get the proper name for the generic type without using string manipulation. Second, I need to access the underlying type. The full property type name returns something like:
System.Collections.Generic.List`1[[System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]
If you are sure you want to use strings, you will have to write your own method to format those type names. Something like:
This code assumes you have all necessary
usings in your file.But I think it’s much better to actually use CodeDOM’s object model. This way, you don’t have to worry about
usings, formatting types or typos:And if you really don’t want to use
default(T), you can find out whether the type is a reference or value type. If it’s a reference type, usenull. If it’s value type, the default constructor has to exist, and so you can call that.