属性的get方法中的无限循环

时间:2017-06-18 14:10:42

标签: c# asp.net asp.net-mvc viewmodel

我有一个viewModel,它有一个用于dropbox的selectitemlist,但是在get方法中我遇到了无限循环,我该怎么办?

        public IEnumerable<SelectListItem> TargetList
    {
        get
        {
            return TargetList;
        }
        private set
        {
            TargetList = new List<SelectListItem> { new SelectListItem { Value = "Android", Text = "Android" },
                                                    new SelectListItem { Value= "WebGL", Text="WebGL" },
                                                    new SelectListItem { Value= "Windows", Text="Windows" },
                                                    new SelectListItem { Value= "IOS", Text="IOS" }};
        }
    }

4 个答案:

答案 0 :(得分:2)

这是一个非常奇怪的setter因为它没有使用你传递给它的任何值。您似乎将setter方法与初始化混淆了。试试这个

{{1}}

除非你打算将它设置为与你班级以外不同的值,否则你不需要设置一个setter,这对你原来的setter不起作用。

答案 1 :(得分:0)

你得到的是打电话给itselft。您需要设置一个支持字段。

private IEnumerable<SelectListItem> _targetList

public IEnumerable<SelectListItem> TargetList
{
    get
    {
        return _targetList;
    }
    private set
    {
        _targetList = new List<SelectListItem> { new SelectListItem { Value = "Android", Text = "Android" },
                                                new SelectListItem { Value= "WebGL", Text="WebGL" },
                                                new SelectListItem { Value= "Windows", Text="Windows" },
                                                new SelectListItem { Value= "IOS", Text="IOS" }};
    }
}

答案 2 :(得分:0)

这里你不需要吸气体或吸气剂体。

public class MyClass
{
    public MyClass()
    {
        this.TargetList = new List<SelectListItem> 
        {
            new SelectListItem { Value = "Android", Text = "Android" },
            new SelectListItem { Value= "WebGL", Text="WebGL" },
            new SelectListItem { Value= "Windows", Text="Windows" },
            new SelectListItem { Value= "IOS", Text="IOS" }
         }
     }
     public IEnumerable<SelectListItem> TargetList
     {  get ; private set; }
}

答案 3 :(得分:0)

你有一个无限循环的原因是你的getter在没有终止条件的情况下递归调用自身。如果您希望使用某些默认值初始化您的属性并允许调用代码来更改它,您可以使用自动实现属性,如此...

public IEnumerable<SelectListItem> TargetList { get; set; } =
    new List<SelectListItem>
    {
        new SelectListItem() { Value="Android",Text="Android"},
        new SelectListItem() { Value= "WebGL", Text="WebGL" },
        new SelectListItem() { Value= "Windows", Text="Windows" },
        new SelectListItem() { Value= "IOS", Text="IOS" }
    };

通过这种方式,您可以使用默认项目,如果愿意,仍可以在运行时将其设置为不同的列表。如果您不希望更改列表,则可以不使用属性的set;部分。