Skip to content

Instantly share code, notes, and snippets.

@dontjee
Last active December 16, 2015 09:48
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save dontjee/5415261 to your computer and use it in GitHub Desktop.
Save dontjee/5415261 to your computer and use it in GitHub Desktop.
internal class ObjectConverterFactory
{
private static readonly Dictionary<Type, IObjectToTypeConverter> _objectToTypeConverters = GetObjectToTypeConverters();
public static IObjectToTypeConverter GetConverterFor( Type type )
{
Type typeToCheck = type;
while ( typeToCheck != typeof( object ) && typeToCheck != null )
{
if ( _objectToTypeConverters.ContainsKey( typeToCheck ) )
{
return _objectToTypeConverters[typeToCheck];
}
typeToCheck = type.BaseType;
}
throw new NotSupportedException( string.Format( "The type {0} is not supported", type.Name ) );
}
private static Dictionary<Type, IObjectToTypeConverter> GetObjectToTypeConverters()
{
return Assembly.GetAssembly( typeof( ObjectConverterFactory ) )
.GetTypes()
.Where( t => typeof( IObjectToTypeConverter ).IsAssignableFrom( t ) && !t.IsInterface && !t.IsAbstract )
.SelectMany( t =>
{
var instance = Activator.CreateInstance( t ) as IObjectToTypeConverter;
return instance.GetConvertableTypes()
.Select( type => new KeyValuePair<Type, IObjectToTypeConverter>( type, instance ) );
} )
.ToDictionary( pair => pair.Key, pair => pair.Value );
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment