我有以下问题:我有一个IDto接口和一个Dto基类来实现所述接口.

基类重写HasId基类中定义的idManualId.

然后我还有一个AuthorDto,它继承自Dto基类.

现在,当我try 对服务执行http请求(POST方法)时,ManualId无法正确传输到服务,即使JSON字符串包含正确的ManualId.

请帮忙.

我的IDto接口:

public interface IDto : IHasId 
{
    IDto CloneData();
}

我的dto基类:

public abstract class Dto : HasId, IDto 
{
    [DataMember]
    public override long? Id { get; set; }

    [DataMember]
    public override Guid ManualId { get; protected set; } = Guid.NewGuid();

    public abstract IDto CloneData();

    protected bool Equals(Dto other) 
    {
        return base.Equals(other) && Id == other.Id;
    }

    public override bool Equals(object obj) 
    {
        if(ReferenceEquals(null, obj)) return false;
        if(ReferenceEquals(this, obj)) return true;
        if(obj.GetType() != GetType()) return false;

        return Equals((Dto)obj);
    }

    public override int GetHashCode() 
    {
        unchecked 
        {
            return(base.GetHashCode() * 397) ^ Id.GetHashCode();
        }
    }
}

HasId级:

public abstract class HasId : IHasId 
{
    public abstract long? Id { get; set; }
    public abstract Guid ManualId { get; protected set; }

    protected bool Equals(HasId other) 
    {
        return Id == other.Id && ManualId.Equals(other.ManualId);
    }

    public override bool Equals(object obj) 
    {
        if(ReferenceEquals(null, obj)) return false;
        if(ReferenceEquals(this, obj)) return true;
        if(obj.GetType() != GetType()) return false;

        return Equals((HasId) obj);
    }

    public override int GetHashCode() 
    {
        unchecked 
        {
            return(Id.GetHashCode() * 397) ^ ManualId.GetHashCode();
        }
    }
}

执行HttpRequest的类:

public class HttpHelper 
{
    private readonly HttpClient _client = new();

    public async Task<TResult> GetObject<TResult>(string requestUri) 
    {
        var response = await _client.GetAsync(requestUri);
        response.EnsureSuccessStatusCode();
        var valueInJsonFormat = await response.Content.ReadAsStringAsync();
        return JsonConvert.DeserializeObject<TResult>(valueInJsonFormat);
    }

    public async Task<TResult> PostObject<T, TResult>(T obj, string requestUri) 
    {
        var json = JsonConvert.SerializeObject(obj);
        var data = new StringContent(json, Encoding.UTF8, "application/json");
        var response = await _client.PostAsync(new Uri(requestUri), data);

        if (response.StatusCode != HttpStatusCode.OK) 
        {
            var httpContent =
                JsonConvert.DeserializeObject<HttpResponseContent>(await response.Content.ReadAsStringAsync());

            try 
            {
                response.EnsureSuccessStatusCode();
            }
            catch(Exception e) 
            {
                throw new Exception(httpContent?.Detail ?? e.Message, e);
            }
        }

        var result = await response.Content.ReadAsStringAsync();

        return JsonConvert.DeserializeObject<TResult>(result);
    }
}

这是JSON字符串:

[
{"Author":
  {
    "Id":1,
    "Settings":
      {
        "Id":1,
        "ArchiveXml":false,
        "CreatePdfImmediately":false,
        "OverwriteExistingXml":false,
        "SaveSimilarTopic":false,
        "PdfNameTemplate":null,"PdfPath":null, 
        "ManualId":"624fa6e3-0864-40bf-87c3a7fcaa1421d4"
      }, 
    "Name":"Admindef", 
    "IsAdmin":true,
    "PublicKey" : PUBLIC-KEY HERE (removed since its not relevant),
    "ManualId":"f15cb1a5-2d66-4ca9-8dc6-1bf5c25bc7f8"},"Operation":0}]

推荐答案

据我所知,您正在try POST一个JSON字符串,其中包含ManualId,但在服务中,您不会得到与json中相同的ManualId.

我想问题是你的方法是setManualIdprotected.

请看这里:

public abstract Guid ManualId { get; protected set; }

保护它意味着它不会set次被反序列化.

您应该使用默认的get和set对,如下所示:

public abstract Guid ManualId { get; set; }

看看这是否解决了您的问题?

这一变化也可能与你的Dto级和HasId级有关.


如果您希望能够从JSON设置属性,但在代码中对其进行保护,那么应该使用要反序列化的参数创建一个构造函数.

反序列化遵循以下原则:

JSON deserialisation

您需要确保在这个图中,最终将使用可解析的参数调用构造函数.

Csharp相关问答推荐

访问C#中的数据库字段时获取数据是收件箱错误-为什么?&有效,如果声明不有效

更改对象的旋转方向

如何从泛型方法返回一个可为空的T,其中T:notnull?

一小时后,自定义缓存停止在App Insight中保存

EF Core在请求列表时忽略列,但在按ID获取时包含

System.Text.Json数据化的C#类映射

`Task`只有在C#中等待时才会运行吗?

. NET 8控制台应用程序DI错误无法解析Microsoft. Extension. Logging. ILoggerFactory类型的服务'''

在FilePath中搜索一个词,并根据First Match从左到右提取文件路径

如何在不考虑年份的情况下判断日期时间是否在某个日期范围内?

使用Orleans进行的单元测试找不到接口的实现

在允许溢出的情况下将小数转换为长

如何在C#中转换泛型包装类内部的派生类

带有可选参数的模拟方法返回意外的不同值,具体取决于可选的默认值

将内置的OrderedEumable&Quot;类设置为内部类有什么好处?

有没有更好的方法来在CosmosDB上插入非id?

错误CS1061';AuthenticationBuilder';不包含AddOpenIdConnect的定义

如何在.NET Maui中将事件与MVVM一起使用?

单位中快照的倾斜方向

反编译源代码时出现奇怪的字符