如何在 C# 中将 T 类型的模型转换为 'System.Dynamic.ExpandoObject'?

How to cast a model of T type to 'System.Dynamic.ExpandoObject' in C#?

我正在尝试在 class Job.cs

中添加一些参数
namespace Test
{
    public class Job
    {
        public int Id { get; set; }
        public int JobId { get; set; }
        public int JobPropertyType { get; set; }
        public string JobValue { get; set; }
    }
}

我正在使用 Dapper 在 table 中插入数据。 Repository.cs

public async Task<T> Add(T entity)
        {
            using (var connection = await _connectionFactory.GetConnectionAsync())
            {
                return await connection.InsertAsync<T>(entity);
            }
        }

我已经使用 DapperMapper 来映射 table 和数据。 Mapper.cs

public class JobMapper: ClassMapper<Job>
    {
        public JobMapper()
        {
            Schema("Job");
            Table("Job");
            Map(m => m.JobId).Column("JobId");
            Map(m => m.JobPropertyType).Column("JobPropertyType");
            Map(m => m.JobValue).Column("JobValue");
        }
    }

这里是JobService.cs


public async Task<Job> InsertJob(int jobId, int jobPropertyType, string jobValue)
        {
            var job = new Job
            {
                JobId = jobId,
                JobPropertyType = jobPropertyType,
                JobValue = jobValue
            };

            return await this.Repository.Add(job);
        }

另一个服务发送数据

public async Task AddJob(int jobId, string snapshot)
        {
            if (!string.IsNullOrEmpty(snapshot))
            {
               await  _jobService.InsertJob(jobId, (int)JobPropertiesEnum.Snapshot, snapshot);
            }

当我尝试在此处插入数据时,出现此异常:

Message=无法在插入时将类型 'System.Dynamic.ExpandoObject' 隐式转换为 'Test.Job'。(存储库中的 InsertyAsync())

如何转换成Dynamic.ExpandoObject?

我假设您正在使用此处的 Dapper-Extensions:https://github.com/tmsmith/Dapper-Extensions/tree/master/DapperExtensions

InsertAsync returns 一个 Task,dynamic 是一个 ExpandoObject,所以当您尝试获取 return 值时,您的问题就出现了。 return 值是插入实体的键。

你可以把你的代码改成这样(我没时间测试):

public async Task<T> Add(T entity)
{
    using (var connection = await _connectionFactory.GetConnectionAsync())
    {
        var result = await connection.InsertAsync<T>(entity);
        entity.Id = (int) result;
        return entity;
    }
}