如何防止第二次调用 属性,同时在 "this" 子句中使用相同的对象

How to prevent calling a property for the second time, while using the same object inside with "this" clause

我有一个 class 结构,它的字符串属性很少,我想添加另一个 属性,即 returns 同一对象的 Json 字符串值动态地。

我的问题是,当我在创建 Json 结果时使用 this 时,它会再次递归调用该对象,并在最后以 WhosebugException 崩溃。

我试图用 New Introducer() { Id = this.Id } 更改 this 字段,但它导致了同样的错误。

虽然我能够通过识别 bool IsSerializing 参数并手动第二次绕过该字段来解决它,但我正在寻找更合适的解决方案。

是否有命令或属性阻止编译器第二次调用Serialized 属性?还是我一开始就以错误的方式调用了 属性?

这是我的 class:

public class Introducer
{
    public Introducer()
    {
        this.Id = 0;
        this.NameSurname = string.Empty;
        this.EmailAddress = string.Empty;
        this.UserCreated = new User();
    }

    public int Id { get; set; }
    private string _NameSurname;
    public string NameSurname { get { return _NameSurname; } set { _NameSurname = value.Trim(); } }
    private string _EmailAddress;
    public string EmailAddress { get { return _EmailAddress; } set { _EmailAddress = value.Trim(); } }
    public DateTime DateCreated { get; set; }
    public User UserCreated { get; set; }

    public string Serialized
    {
        get
        {
            return JsonConvert.SerializeObject(this, Formatting.Indented);
        }
    }
}

使用[JsonIgnore] 或者更好的是,将其更改为方法

这是一个试用示例。想法是使用 JsonIgnore 属性来指示序列化程序不要选择 属性 进行序列化。

class MyClass
{
    public int Id { get; set; }
    private string _NameSurname;
    public string NameSurname { get { return _NameSurname; } set { _NameSurname = value.Trim(); } }
    private string _EmailAddress;
    public string EmailAddress { get { return _EmailAddress; } set { _EmailAddress = value.Trim(); } }
    public DateTime DateCreated { get; set; }

    [JsonIgnore]
    public string Serialized
    {
        get
        {
            return JsonConvert.SerializeObject(this, Formatting.Indented);
        }
    }
}

调用为:

MyClass obj = new MyClass();
var serialized = obj.Serialized;

编辑:

良好做法 1:如其他答案中所述,可以使用 method 代替 property,如下所示:

class MyClass
{
    public int Id { get; set; }
    private string _NameSurname;
    public string NameSurname { get { return _NameSurname; } set { _NameSurname = value.Trim(); } }
    private string _EmailAddress;
    public string EmailAddress { get { return _EmailAddress; } set { _EmailAddress = value.Trim(); } }
    public DateTime DateCreated { get; set; }

    public string GetJSON()
    {
        return JsonConvert.SerializeObject(this, Formatting.Indented);
    }
}

良好做法 2:遵循正确的 OOD 模式,让对象的序列化(或表示)以一种格式在单独的 class 中完成。

您不应该将这样的代码放入 属性。属性旨在(概念上)用于数据,并且仅是微不足道的代码复杂性;当然不是递归代码。序列化当然不是无足轻重的代码。如果您 did 想要一个概念上合适的 Serialized 属性,它应该包含序列化对象的缓存版本,而不是实际生成序列化数据。相反,生成对象的序列化表示的功能应该在方法中,而不是 属性.