>我有一个视图模型,它有一个可枚举的下拉框选择项列表,但在 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" }};
}
}
这是一个非常奇怪的设置器,因为它不使用你传递给它的任何值。您似乎将 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" }};
该东西不需要有一个二传手,除非你打算实际将其设置为与类外部不同的值,这不适用于你的原始二传手。
你的得到是调用自己。您需要设置支持字段。
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" }};
}
}
这里不需要getter或setter的主体。
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; }
}
你有一个无限循环的原因是你的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;
部分。