我想为任何从前端接收的ViewModel
制作通用的JSON
生成器。我在这里发现,我可以从字符串中获得类型,但我不知道如何在我的情况下实现这一点。我的想法是从角数组发送2个值,第一个是字符串,说什么类型是我的ViewModel
,第二个值是ViewModel
,我需要转换为JSON
。(我需要这个JSON
后端转换为其他文件格式,我有一些特殊的要求,如更改名称属性等)我使用MediatR
,这里是我的类:GenerateJSONQuery
是输入对象,我将从前端获得的对象。
public class GenerateJSONQuery<T> : IRequest<string>
{
public string TypeOfList { get; set; }
public List<T> Data { get; set; }
}
GenerateJSONQueryHandler
是MediatR
的处理程序,它将反射ViewModel
并生成JSON
。
public class GenerateJSONQueryHandler<T> : IRequestHandler<GenerateJSONQuery<T>, string>
{
private readonly IddeeaODPDbContext _context;
private readonly IMapper _mapper;
public GenerateJSONQueryHandler(IddeeaODPDbContext context, IMapper mapper)
{
_context = context;
_mapper = mapper;
}
public async Task<string> Handle(GenerateJSONQuery<T> request, CancellationToken cancellationToken)
{
// logic for generating files, in this part I need to somehow convert
// `request.Data` to specific List<T> where
// T can be e.g. `NewbornByBirthDateViewModel`,
//`IssuedDocumentsViewModel`, `RegisteredVehiclesViewModel`, etc. etc.
}
连接IRequest
和IRequestHandler
的控制器为:
public class GenerateFilesController : ApiBaseController
{
public GenerateFilesController(IOptions<AppSettings> appSettings) : base(appSettings)
{
}
[HttpPost]
[SwaggerOperation(Tags = new[] { "Administration/Document" })]
public async Task<string> List<T>([FromBody] GenerateJSONQuery<T> data, [FromHeader] string Authorization)
{
return await Mediator.Send(data);
}
}
和NewbornByBirthDateViewModel
是我需要序列化成JSON
的VieWModel
的例子。
public class ClientNewbornByBirthDateViewModel
{
[TranslatedFieldName("Identifier", LanguageEnum.EN)]
public int Id { get; set; }
public string Institution { get; set; }
[TranslatedFieldName("Men", LanguageEnum.EN)]
public int MaleTotal { get; set; }
[TranslatedFieldName("Women", LanguageEnum.EN)]
public int FemaleTotal { get; set; }
public int Year { get; set; }
public int Month { get; set; }
}
我很确定我的思维方式是不好的,我需要做一些反思,但我不知道怎么做。我不能只从前端发送ViewModel
类型,然后从context.Set<T>()
中选择所有db
,因为可以有过滤器,而这些过滤器取决于选择哪个ViewModel
,所以我必须将具有数据的对象从前端传递到JSONGenerate
逻辑,然后将其反映到后端特定的ViewModel
。
应用程序必须首先了解类和它们的类型,然后才能通过将数据类型名称作为参数传递来使用反射。
得到所有的数据类型使用反射,你想要的反映你的数据,然后过滤掉使用TypeOfList.
使用此链接获取名称空间内所有类的详细信息。如何在命名空间中获得所有类?