在C#中使用通用可空类型

时间:2019-07-15 09:42:03

标签: api class generics types dapper

我正在通过网络api调用来更新我的表,并向其传递字段,Id和值。

我想允许参数“值”可以为空,或者可以是任何类型(整数,字符串,日期),因此它是通用的。
问题出在api中的行:

await financeService.UpdateAsync(fieldToPascal, dbValue, id);

错误:

  

错误CS0411无法从用法中推断出方法'IFinanceService.UpdateAsync(string,T ?, int)'的类型参数。尝试显式指定类型参数。

我是泛型新手,不确定为什么指定的参数无效?为了允许将通用的可为null的类型传递给我的服务,我必须进行哪些更改?谢谢。

Web API

[Route("update/{field}/{id}/{value?}")]
[HttpPost]
public async Task<HttpResponseMessage> UpdateAsync(string field, int id, string value = null)
{
    string fieldToPascal = StringExtensions.FirstCharToUpper(field);

    object dbValue = value;
    if (DateTime.TryParseExact(value, "dd-MM-yy", new CultureInfo("en-GB"), DateTimeStyles.None, out DateTime date)) {
        dbValue = date;
    }

    await financeService.UpdateAsync(fieldToPascal, dbValue, id);
    return Request.CreateResponse(HttpStatusCode.OK, true);
}

服务层

public async Task UpdateAsync<T>(string field, T? value, int id) where T : struct
{
    await FinanceRepository.UpdateAsync(field, value, id);
}

Dapper回购

public async Task UpdateAsync<T>(string field, T? value, int id) where T : struct
{
    using (var sql = dbConnectionFactory())
    {
        await sql.ExecuteAsync($@"
            UPDATE {TABLE} SET {field} = @value WHERE Id = @id",
            new
            {
                value,
                id
            }
        );
    }
}

0 个答案:

没有答案