У меня есть библиотеки DLL с помощью следующей иерархии:Как динамически отбрасывать список типов на основе для производного типа
Interface ISchema {}
class Schema:ISchema{}
class TableSchema:Schema{}
class ViewSchema:Schema{}
У меня есть другой DLL, имеющий следующую иерархию:
Interface ISearch {}
class Table:ISearch{}
class View:ISearch{}
Следующий код запускает операцию поиска по Таблице или Просмотр в соответствии с выбором пользователя:
private void FindNowButton_Click(object sender, EventArgs e)
{
// return Table or View according to user selection. (Property is an internal class helping to retrieve the selected type)
var type = (ObjectsTypeComboBox.SelectedItem as Property).Type;
// Create an instance of table or View as ISearch
var instance = (ISearch)Activator.CreateInstance(type);
// Call to relevant Search (table.Search or View.Search)
// _dataManager help to get the records from Schema hierarchy
// text is the text to search
var result = instance.Search(_dataManager, FindWhatTextBox.Text);
// Show in DataGridView the result
FindResultsDGV.DataSource = result;
}
Каждый метод поиска возвращает список. Мне нужно отображать разные столбцы в сетке. TableSchema и ViewSchema имеют разные свойства, а выполнение выполняется следующим образом.
FindResultsDGV.DataSource = result.Cast<TableSchema> ; // or result.Cast<ViewSchema>
Как я могу динамически получить правильный тип на этом этапе?
Любое другое решение приветствуется
UPDATE:
Согласно @GiladGreen
public interface ISearchSchemaFactory
{
ISearch<ISchema> GetSearch(Type schemaType);
}
public class Factory : ISearchSchemaFactory
{
public ISearch<ISchema> GetSearch(Type schemaType)
{
if (schemaType.Equals(typeof(Table)))
{
return new BL.AdvancedSearch.Table(); // Getting an error here
// Cannot implicitly convert type 'Table' to 'ISearch<ISchema>'. An explicit conversion exists (are you missing a cast?)
}
else if (schemaType.Equals(typeof(View)))
{
// TODO
}
return null; // TODO
}
}
Считаете ли вы использование Generics? – Aron