2017-06-18 76 views
0

我有一个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" }}; 
     } 
    } 
+0

可能的重复[无限循环在getter/setter c#](https://stackoverflow.com/questions/16694098/infinite-loop-in-getter-setter-c-sharp) – mjwills

回答

0

你得到的是自称。您需要设置一个后台字段。

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

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

public IEnumerable<SelectListItem> TargetList{ get; } 
        = 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" }}; 

无需事情有一个二传手,除非你打算真正将其设置为在类的外部不同的值,这将不会与最初制定者的工作。

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; } 
} 
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" } 
    }; 

通过这种方式,你有你的默认项和如果您愿意,它仍然可以在运行时设置为不同的列表。如果您不希望更改列表,那么您可以在没有属性的情况下执行此操作。