если вы посмотрите на следующий код, вы (надеюсь) увидите, что я пытаюсь архивировать. В основном этот код делает:
- Запрос на общие элементы хранилища (они сохраняют свой тип в виде строки)
- Если элемент является подклассом SearchCriteria, создайте правильный экземпляр
- Добавить экземпляр в список (SearchCriteria является суперклассом)
Конечно, не очень элегантный случай псевдопереключателя, который мне пришлось бы обновить для всех различных критериев, которые я создаю.
Итак, мой вопрос, есть ли "общий" способ создания экземпляра, который строго типизирован, используя строку в качестве "источника" для типа.
Я знаю, что могу использовать Reflection для создания экземпляра, но это объект типа, поэтому я не смог бы добавить его в список. О, только что пришла идея ... Создать объект, используя отражение, привести его к супертипу (SearchCrit), добавить в список. Надеюсь, реальный тип все еще должен быть «правильным подтипом» ...
Попробую и обновлю этот пост с результатами. Есть идеи получше?
Chris
private IList<SearchCriteria> _searchCriteriaAll;
public IList<SearchCriteria> SearchCriteriaAll
{
get
{
if (_searchCriteriaAll == null)
{
_searchCriteriaAll = new List<SearchCriteria>();
var tN = typeof (SearchCriteria).ToString();
foreach (var o in DataStorage.LinkedObjects)
{
if (tN.StartsWith(o.TypeName))
{
if (o.TypeName == typeof(StringSearchCriteria).ToString())
_searchCriteriaAll.Add(new StringSearchCriteria(o));
}
}
}
return _searchCriteriaAll;
}
}
EDIT:
Спасибо за подсказки, «правильный» путь определенно будет заводским. Я посмотрю на это. На данный момент я использую этот хак, потому что подклассы такие маленькие, я не хочу фабрику для каждого .. (и это место в настоящее время единственное с такой "необычной" функцией)
private IList<SearchCriteria> _searchCriteriaAll;
public IList<SearchCriteria> SearchCriteriaAll
{
get
{
if (_searchCriteriaAll == null)
{
_searchCriteriaAll = new List<SearchCriteria>();
var tN = typeof (SearchCriteria).ToString();
foreach (var o in DataStorage.LinkedObjects)
{
if (tN.StartsWith(o.TypeName))
{
var newO = Activator.CreateInstance(typeof(SearchCriteria).Assembly.FullName, o.TypeName);
var newCrit = newO.Unwrap() as SearchCriteria;
newCrit.DataStorage = o;
_searchCriteriaAll.Add(newCrit);
}
}
}
return _searchCriteriaAll;
}
}