c# - 使用匿名函数自动初始化属性
问题描述
我试图摆脱一些带有匿名函数和类的代码。
我坚持这一点:
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;
}
问题是字段初始化器不能引用非静态方法。
有可能解决这个问题吗?
编辑:我添加了这两行代码:
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;
}))();
}
它创建了一个返回 a 的匿名函数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
推荐阅读
- bazel - 使用多个编译器进行 Bazel 编译
- c++ - 获取捕获的 lambda 的 lambda 调用运算符的地址
- python - 烧瓶不导入/查找模块
- python - 如何在 Anaconda 中安装 Matplotlib 3.4.1?
- sql-server - 如何从 WSL 2 Linux C++ 应用程序连接到 Windows 10 上的 SQL Server
- machine-learning - 这是使用 Keras 嵌入层的正确方法吗?
- visual-studio-code - 如何使片段仅显示在 Visual Studio Code 中的特定文件扩展名?
- react-native - 在 react-native-svg 内部元素上添加 Press 事件
- java - 在 Java 中使用 base64 编码的公钥
- python - 密码永远无效 - Django