public static IEnumerable<ITypeElement> GetRegisteredTypes(this ICSharpExpression expression)
{
// match typeof() expressions
var typeOfExpression = expression as ITypeofExpression;
if (typeOfExpression != null)
{
var typeElement = (IDeclaredType)typeOfExpression.ArgumentType;
yield return typeElement.GetTypeElement();
}
// match new[] or new Type[] expressions
var arrayExpression = expression as IArrayCreationExpression;
if (arrayExpression != null)
{
foreach (var initializer in arrayExpression.ArrayInitializer.ElementInitializers.OfType<IExpressionInitializer>())
{
foreach (ITypeElement type in initializer.Value.GetRegisteredTypes())
{
yield return type;
}
}
}
// match new List<Type> expressions
var objectCreationExpression = expression as IObjectCreationExpression;
if (objectCreationExpression != null)
{
foreach (var initializer in objectCreationExpression.Initializer.InitializerElements.OfType<ICollectionElementInitializer>())
{
// todo find out if THERE CAN BE ONLY ONE!!!1
if (initializer.Arguments.Count != 1)
{
continue;
}
foreach (ITypeElement type in initializer.Arguments[0].Value.GetRegisteredTypes())
{
yield return type;
}
}
}
}