Этот подход, если вы не хотите переключаться на код, генерирующий ORM.
В таблицу объектов включите полное имя типа объекта.
Затем вы можете сделать что-то вроде:
private Dictionary<String, Type> _objectTypes = new Dictionary<String, Type>();
public ObjectFactory()
{
// Preload the Object Types into a dictionary so we can look them up later
foreach (Type type in typeof(ObjectFactory).Assembly.GetTypes())
{
if (type.IsSubclassOf(typeof(BaseEntity)))
{
_objectTypes[type.Name.ToLower()] = type;
}
}
}
Теперь, с предварительно загруженным преобразователем, вы можете заменить свой код на:
string objectName = dr["ClassType"].ToString().ToLower();
Type objectType;
if (_objectTypes.TryGetValue(objectName, out objectType))
{
return (BaseEntity)Activator.CreateInstance(objectType,reader);
}
Передайте читателю конструктор вашего объекта, чтобы он мог полностью заполнить себя, этот тип кода не принадлежит фабрике.