Я набрал это в Notepad ++ очень быстро, поэтому, пожалуйста, прости любые опечатки / ошибки. Если бы это было возможно, я бы избавился от некоторой повторяющейся работы (то есть длинного случая). Ничего страшного, но мне любопытно, если это возможно, и если да, то как плохо было бы на самом деле реализовать код.
jsonFromWebpage = {
StatusUpdate: {
QueryType: "SomeClassName",
LocalCount: 5,
RemoteCount: 5
},
StatusUpdate: {
QueryType: "AnotherClass",
LocalCount: 29,
RemoteCount: 30
}
}
// Model
public class StatusUpdate
{
public string QueryType { get; set; }
public int LocalCount { get; set; }
public int RemoteCount { get; set; }
}
// Controller
public IActionResult GetStatusUpdate([FromBody] List<StatusUpdate> status)
{
_service.GetStatusUpdate(status);
return status
}
// Service
public List<Status> GetStatusUpdate(List<StatusUpdate> status)
{
foreach(var s in status)
{
var typeArgument = s.QueryType; // <--- Is there a way for this...
status.CurrentCount = GetTotalCount<typeArgument>(); // <--- to work here?
status.RemoteCount = thisworksfineforotherreasons(s.QueryType);
}
}
// Repo
public int GetTotalCount<T>() where T: class
{
var result = _db.GetCount<T>();
return result;
}
РЕДАКТИРОВАТЬ
Во-первых, спасибо всем, кто ответил. Прочитав все до сих пор, я хотел дать немного больше контекста. Вот другой пример на примере:
// View
<div class="col-12">
<div class="api-types">History</div>
<div class="progress-bar">50 out of 50 copied</div>
</div>
<div class="col-12">
<div class="api-types">Users</div>
<div class="progress-bar">25 out of 32 copied</div>
</div>
// -- View javascript
var types = [];
$(".api-types").each(function (c, i) {
types.push({ ApiAndClassName: $(i).text() });
});
pushToController(JSON.stringify(types));
// Controller
public IActionResult GetSyncStatus(List<SyncStatusVM> status)
{
_service.GetSyncStatus(status);
return Json(status);
}
// Service
public List<SyncStatusVM> GetSyncStatus(List<SyncStatusVM> status)
{
foreach(var s in status)
{
// LocalCount
var magicTypeFigurator = s.ApiAndClassName
s.LocalCount = _repo.GetCount<magicTypeFigurator>(); <-- "this is a variable but should be a type..."
// Remote
var url = $"https://api.domain.com/{s.ApiAndClassName.ToLower()}"
s.RemoteCount = FetchCountFromApi(url);
}
return status;
}
// Repository
public long GetCount<T>()
{
var result = _orm.Count<T>();
return result;
}
// Models
public class SyncStatusVM
{
public string ApiAndClassName { get; set; }
public int LocalCount { get; set; }
public int RemoteCount { get; set; }
}
public class History
{
public long Id {get;set;}
public DateTime CreatedDate {get;set;}
public string Message {get;set;}
}
public class Users
{
public long Id {get;set;}
public string FirstName {get;set;}
public string LastName {get;set;}
}
Используя этот код, я могу просто создать раздел в представлении и класс для каждого типа. Класс повторно используется ORM и десериализуется из API. Наиболее громоздким моментом является наличие в контроллере оператора case, который вызывает универсальный метод с правильным типом, основанным на «ApiAndClassName». Я мог бы отредактировать ORM так, чтобы он основывался на строках, а не на общем, но мне не нравится этот метод по разным причинам. Я мог бы превратить оператор case в коллекцию в контроллере или просто переместить его на уровень обслуживания, но то, что у меня есть, уже работает. Я также мог бы просто сделать рефакторинг, чтобы представление строилось из коллекции, но есть и другие точки данных, где это не лучший вариант. Если нет чего-то, что я упускаю, родовой аргумент из строки вещь вроде как имеет смысл. Это крайний случай ... и просто любопытно, можно ли сделать это достаточно хорошо.