Общий метод для автоматически сгенерированных классовC#

Место общения программистов C#
Ответить
Anonymous
 Общий метод для автоматически сгенерированных классов

Сообщение Anonymous »

Контекст:
Я работаю над приложением .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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»