我试图摆脱一些带有匿名函数和类的代码。
我坚持这个:
public List<Object> Years { get; set; } = GetYears();
private static List<Object> GetYears()
{
List<Object> retList = new List<Object>();
retList.Add(new { Value = (byte)255, Name = "Any" });
retList.Add(new { Value = (byte)254, Name = "None" });
for (byte i = 0; i < 50; i++)
{
retList.Add(new { Value = i, Name = (2000 + i).ToString() });
}
return retList;
}
是否有可能摆脱静态的GetYears((方法?
我的意思是这样的:
public List<Object> Years { get; set; } = () =>
{
List<Object> retList = new List<Object>();
for (byte i = 0; i < 50; i++)
{
retList.Add(new { Value = i, Name = (2000 + i).ToString() });
}
return retList;
}
问题是字段初始值设定项不能引用非静态方法。
有可能解决这个问题吗?
编辑:我添加了以下 2 行代码:
retList.Add(new { Value = (byte)255, Name = "None" });
retList.Add(new { Value = (byte)254, Name = "Any" });
从技术上讲,你可以做这样的事情
public class LambdaInitalization {
public List<Object> Years = ((Func<List<Object>>)(() =>
{
List<Object> retList = new List<Object>();
for (byte i = 0; i < 50; i++)
{
retList.Add(new { Value = i, Name = (2000 + i).ToString() });
}
return retList;
}))();
}
它创建一个匿名函数,返回一个List<Object>
,然后运行它(不幸的是它不能被暗示,它必须是显式强制转换(。
更好的解决方案是只使用构造函数,几乎完全按照构造函数存在的目的去做。
public class CtorInitalization {
public List<Object> Years { get; set; }
public CtorInitalization() {
Years = new List<Object>();
for (byte i = 0; i < 50; i++)
{
Years.Add(new { Value = i, Name = (2000 + i).ToString() });
}
}
}
有趣的是,lamda 初始化无论如何都会编译到构造函数中,因此在构造函数之外定义它在功能上没有有效的用途。
在此处查看这两个实际操作:https://dotnetfiddle.net/1f62Hj
如前所述,您无法通过设计执行此操作,初始值设定项不能引用非静态字段、方法或属性"字段">,匿名方法不是这样。
你可以把它放在构造函数中,其他选择是让它成为一个Lazy<T>
public Lazy<List<Object>> Years { get; set; } = new Lazy<List<object>>(() =>
{
List<object> retList = new List<object>();
for (byte i = 0; i < 50; i++)
{
retList.Add(new { Value = i, Name = (2000 + i).ToString() });
}
return retList;
});
或者用Enumerable.Range
稍微破解一下
private List<Object> Years { get; set; }
= Enumerable.Range(0, 50)
.Select(i => (object)new { Value = i, Name = (2000 + i).ToString() })
.ToList();
注意:无论如何,整个List<object>
似乎有点可疑
或者也许更简洁一点是值元组
private List<(int Value, string Name)> Years { get; set; }
= Enumerable.Range(0, 50)
.Select(i => (i, (2000 + i).ToString()))
.ToList();