Вместо того, чтобы передавать параметр MasterSectionEnum, измените ваш метод так, чтобы он принимал параметр типа. Затем просто используйте этот тип generi c в одном вызове UpdateRevision
.
public async Task<MutationResponse> SetRequestStage<SectionType>(
string requestStage,
Guid requestId
) {
...
await UpdateRevision<SectionType>(request.DataId).ConfigureAwait(false);
....
}
Если все допустимые типы SectionType
имеют общий интерфейс или являются производными от одного класса, тогда вы можете взять далее, добавьте ограничение к SectionType
и избегайте необходимости обрабатывать некорректные типы во время выполнения.
Редактировать:
Так что SetRequestStage
не может быть обобщенным c да? Ну, склонность сделать его обобщенным c проистекает из того факта, что он зависит от UpdateRevision
, который является обобщенным c. Это в свою очередь зависит от DbContext.Set()
. И вы используете его c версию. Но хорошая новость заключается в том, что, похоже, существует non-generi c версия , которая принимает переменную типа в качестве параметра. Итак:
async Task UpdateRevision<T>(
Guid id,
Type t
) where T : class, IAEIMaster, IRevisionData {
var dbSet = this._dbContext.Set(t);
...
}
А потом:
public async Task<MutationResponse> SetRequestStage(
string requestStage,
Guid requestId,
Type SectionType
) {
...
await UpdateRevision(request.DataId, SectionType).ConfigureAwait(false);
....
}
Я не знаю, как выглядит ваш пользовательский интерфейс. Но, в общем случае:
var dic = new Dictionary<MasterSectionEnum, Type> {
{ MasterSectionEnum.LOCALCODE, typeof(LocalCode) },
{ MasterSectionEnum.NATIONALCODE, typeof(NationalCode) },
...
};
public async someUiRelatedMethod(
string reqStage,
Guid reqId,
MasterSectionEnum sectionType
) {
await SetRequestStage(reqStage, reqId, dic[sectionType]);
}
Извините, если синтаксис последнего не совсем правильный. Но вы поняли.