Я работаю над приложением .NET C# в Visual Studio.
Я обнаружил наборы данных для взаимодействия с моей базой данных, поэтому я использую TableAdapters. Каждый раз, когда я добавляю новый адаптер таблицы, связанный с таблицей, дизайнер создает несколько определенных классов. Если я создам TableApdapter для таблицы «myTable», дизайнер создаст класс MyTableTableAdapter, унаследованный от global::system.Component, и класс MyTableDataTable, унаследованный от DataTable.< /strong>
Проблема:
Я создал собственный DataGridView со следующим атрибутом:
Код: Выделить всё
private System.ComponentModel.Component tableAdapter;
Теперь я упрощу задачу:
Код: Выделить всё
//Auto-generated by the designer
public partial class ATableAdapter : global::system.Component
{
public virtual ADataTable GetData()
{
ADataTable aDataTable = new ADataTable();
// Do things
return aDataTable;
}
}
//Auto-generated by the designer
public partial class BTableAdapter : global::system.Component
{
public virtual BDataTable GetData()
{
ADataTable bDataTable = new BDataTable();
// Do things
return bDataTable;
}
}
// My code
public class TableAdapterManager
{
private Component tableAdapter;
public TableAdapterManager(Component tableAdapter)
{
this.tableAdapter = tableAdapter;
}
// What I want to do
public DataTable GetData()
{
return tableAdapter.GetData();
}
}
класс Component не реализует никакого определения для public DataTable GetData().
Мне нужно получить DataTable, возвращенный методом GetData(), независимо от типа TableAdapter. Дело в том, что я не хочу изменять автоматически сгенерированный код. Я один раз изменил его, а дизайнер переписал.
Пока я думал об интерфейсах:
Код: Выделить всё
public interface IDataProvider
{
DataTable GetData();
}
Код: Выделить всё
public partial class ATableAdapter : IDataProvider
{
public DataTable GetData() // In respect to the interface
{
ADataTable aDataTable = new ADataTable();
// Do exact same things as in the original definition but with DataTable parent type
return adataTable;
}
}
public partial class BTableAdapter : IDataProvider
{
public DataTable GetData() // In respect to the interface
{
BDataTable bDataTable = new BDataTable();
// Do exact same things as in the original definition but with DataTable parent type
return bDataTable;
}
}
// My code
public class TableAdapterManager
{
private Component tableAdapter;
public TableAdapterManager(Component tableAdapter)
{
this.tableAdapter = tableAdapter;
}
// What I want to do
public DataTable GetData()
{
return ((IDataProvider)tableAdapter).GetData();
}
}
Код: Выделить всё
Error CS0111 Type 'ATableAdapter' already defines a member called 'GetData' with the same parameter types.
Error CS0111 Type 'BTableAdapter' already defines a member called 'GetData' with the same parameter types.
C:\Path\ProjectDataSet.Designer.cs
Простым решением было бы назвать метод интерфейса немного по-другому, но было бы не так строго.
Подробнее здесь: https://stackoverflow.com/questions/788 ... ed-classes
Мобильная версия