Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何防止第二次调用属性,同时在内部使用带“的同一对象”;这";条款_C#_Oop_Recursion_Properties_Custom Attributes - Fatal编程技术网

C# 如何防止第二次调用属性,同时在内部使用带“的同一对象”;这";条款

C# 如何防止第二次调用属性,同时在内部使用带“的同一对象”;这";条款,c#,oop,recursion,properties,custom-attributes,C#,Oop,Recursion,Properties,Custom Attributes,我有一个几乎没有字符串属性的类结构,我想添加另一个属性,动态返回同一对象的Json字符串值 我的问题是,当我在创建Json结果时使用this时,它会再次递归调用该对象,并在最后与StackOverflowException崩溃 我试图用New introductor(){Id=this.Id}更改this字段,但它导致了相同的错误 虽然我能够通过识别boolis序列化参数并第二次手动绕过该字段来解决这个问题,但我正在寻找一个更合适的解决方案 是否有命令或属性阻止编译器第二次调用Serialize

我有一个几乎没有字符串属性的类结构,我想添加另一个属性,动态返回同一对象的
Json
字符串值

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

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

虽然我能够通过识别bool
is序列化
参数并第二次手动绕过该字段来解决这个问题,但我正在寻找一个更合适的解决方案

是否有命令或属性阻止编译器第二次调用
Serialized
属性?还是我一开始给酒店打错电话了

这是我的班级:

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:如其他答案中所述,可以使用
方法
代替
属性
,如下所示:

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 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:如其他答案中所述,可以使用
方法
代替
属性
,如下所示:

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模式,让对象的序列化(或表示)在一个单独的
类中完成

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

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

也许,不要将序列化的属性声明为公共属性,而只是内部属性。您可以向该属性添加
[JsonIgnore]
属性。或者将其作为一个方法。也许,不要将该属性序列化为public,而只声明为internal。您可以向该属性添加
[JsonIgnore]
属性。或者让它成为一种方法。我支持@BlueMonkMN。扩展函数或重写ToString()是实现它的选项。扩展函数或重写ToString()是实现它的选项。感谢您的详细回答,我用“JSonIgnore”实现了正确的解决方案。您对“良好实践”的看法可能是对的,但是我喜欢它的“序列化版本”,它在代码中给我一种“通用属性”的感觉。感谢您的详细回答,我成功地用“JSonIgnore”实现了正确的解决方案。关于“良好实践”,您可能是对的,但是我喜欢它的“序列化版本”,它在代码中给我一种“通用属性”的感觉。