Определите один метод C #, который принимает любой объект, который можно использовать в квадратных скобках - PullRequest
1 голос
/ 02 мая 2019

Я реализую метод, который, учитывая некоторые данные, полученные через DataRowView или DbDataReader, гидратирует DTO.

Таким образом, оба источника данных реализуют возможность извлечения значения определенного поля через

public object this[string name] { get; }

Но это поведение не ограничено общим интерфейсом между двумя классами, поэтому я не могу его использовать, и мне приходится писать код гидратации дважды, не меняя ни одного бита. Что плохо.

public MyDTO Hydrate(DataRowView data)
{
    MyDTO f_return = new MyDTO();
    f_return.Foo = (string)data["foo"];
    f_return.Bar = (uint)data["bar"];
    f_return.Baz = (DateTime)data["baz"];
    return f_return;
}

public MyDTO Hydrate(DbDataReader data)
{
    MyDTO f_return = new MyDTO();
    f_return.Foo = (string)data["foo"];
    f_return.Bar = (uint)data["bar"];
    f_return.Baz = (DateTime)data["baz"];
    return f_return;
}

Мне не хватает некоторого синтаксиса C #, который позволил бы мне определить один метод, который ограничивает ввод для любого объекта, к которому можно получить доступ через квадратные скобки?

как то так

public MyDTO Hydrate(object[string] data)

Заранее спасибо!

1 Ответ

3 голосов
/ 02 мая 2019

Мне не хватает некоторого синтаксиса C #, который позволил бы мне определить один метод, который ограничивает ввод для любого объекта, к которому можно получить доступ через квадратные скобки?

Нет; нет синтаксиса C # для выражения «что-то индексируемое», кроме создания interface с этим индексатором, т.е.

interface ISomeInterface {
    object this[string name] {get;}
}

и ограничивая себя экземплярами ISomeInterface или некоторыми общими <T> с ограничением where T : ISomeInterface.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...