Tuve problemas para resolver un problema similar alrededor de las clases de la tabla de datos en lugar de los mensajes. El problema de raíz mencionado anteriormente de convertir una versión no genérica de la clase a una versión genérica derivada era el mismo.
Para permitir la inyección en una biblioteca de clases portátil que no admite bibliotecas de bases de datos, introduje un conjunto de clases de interfaz, con la intención de que pudiera pasar un tipo y obtener un genérico coincidente. Terminó necesitando implementar un método genérico.
// Interface for injection
public interface IDatabase
{
// Original, non-functional signature:
IDatatable<object> GetDataTable(Type dataType);
// Functional method using a generic method:
IDatatable<T> GetDataTable<T>();
}
Y esta toda la implementación utilizando el método genérico anterior.
La clase genérica que se emitirá desde un diccionario.
// Non-generic base class allows listing tables together
abstract class Datatable
{
Datatable(Type storedClass)
{
StoredClass = storedClass;
}
Type StoredClass { get; private set; }
}
// Generic inheriting class
abstract class Datatable<T>: Datatable, IDatatable<T>
{
protected Datatable()
:base(typeof(T))
{
}
}
Esta es la clase que almacena la clase genérica y lo convierte en satisfacer el método genérico en la interfaz
class Database
{
// Dictionary storing the classes using the non-generic base class
private Dictionary<Type, Datatable> _tableDictionary;
protected Database(List<Datatable> tables)
{
_tableDictionary = new Dictionary<Type, Datatable>();
foreach (var table in tables)
{
_tableDictionary.Add(table.StoredClass, table);
}
}
// Interface implementation, casts the generic
public IDatatable<T> GetDataTable<T>()
{
Datatable table = null;
_tableDictionary.TryGetValue(typeof(T), out table);
return table as IDatatable<T>;
}
}
Y finalmente la llamada del método de interfaz.
IDatatable<CustomerAccount> table = _database.GetDataTable<CustomerAccount>();
Siguiendo cuestión tiene un escenario de fundición evitado el uso de los genéricos - [Código Refactoring para evitar la conversión de tipos] (http://stackoverflow.com/questions/21482850/refactoring-code-to-avoid-type-casting) – Lijo