使用匿名函数自动初始化属性



我试图摆脱一些带有匿名函数和类的代码。

我坚持这个:

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();

相关内容

  • 没有找到相关文章

最新更新