Я пишу общий код, который должен обрабатывать ситуации, когда данные загружаются из нескольких источников. У меня есть метод с следующей подписью:Упростить общий вывод типа
public static TResult LoadFromAnySource<TContract, TSection, TResult>
(this TSection section,
string serviceBaseUri,
string nodeName)
where TSection : ConfigurationSection
where TResult : IDatabaseConfigurable<TContract, TSection>, new()
where TContract : new()
Но это излишество: когда я прохожу TResult
, я уже знаю, что TContract
и TSection
точно есть. В моем примере:
public interface ISourceObserverConfiguration
: IDatabaseConfigurable<SourceObserverContract, SourceObserverSection>
Но я должен написать следующее:
sourceObserverSection.LoadFromAnySource<SourceObserverContract,
SourceObserverSection,
SourceObserverConfiguration>
(_registrationServiceConfiguration.ServiceBaseUri, nodeName);
Вы можете видеть, что я должен указать пару <SourceObserverContract, SourceObserverSection>
дважды, это нарушение DRY Принсипе. Так что я хотел бы написать что-то вроде:
sourceObserverSection.LoadFromAnySource<SourceObserverConfiguration>
(_registrationServiceConfiguration.ServiceBaseUri, nodeName);
и сделать SourceObserverContract
и SourceObserverSection
выведенного из интерфейса.
Возможно ли в C# или я должен указать его везде вручную?
IDatabaseConfigurable
выглядит следующим образом:
public interface IDatabaseConfigurable<in TContract, in TSection>
where TContract : ConfigContract
where TSection : ConfigurationSection
{
string RemoteName { get; }
void LoadFromContract(TContract contract);
void LoadFromSection(TSection section);
}
Тогда расширение просто называет эти два метода, основанные на какой-то логики. Я должен указать типы, потому что мне нужно получить доступ к свойствам каждой конкретной реализации, поэтому мне нужна ковариация.
Если ваша сигнатура метода была 'IDatabaseConfigurable LoadFromAnySource (этот раздел TSection, строка serviceBaseUri, string nodeName, Func contractCreator) '(или просто' TContract contract'), типы могут быть выведены из использования. –
Как это нарушение принципа DRY? Это немного сложнее, чем «не писать одно и то же дважды». Вам, наверное, все равно, что вы три раза пишете 't' в' twitter', не так ли? : D Эти два не являются * одинаковыми - одно более общее, чем другое. В любом случае комментарий @JeroenMostert - это самый лучший подход, и он должен быть полностью ответом. Хотя, вероятно, где-то вроде Programmers, а не SO - я не думаю, что это хороший вопрос для SO, действительно. – Luaan
@JeroenMostert Да, но они не знали, для чего нужно использовать IDatabaseConfigurable. – Rob