首页 > 解决方案 > 使用匿名函数自动初始化属性

问题描述

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

我坚持这一点:

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

标签: c#initializationautomatic-properties

解决方案


从技术上讲,你可以做这样的事情

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


推荐阅读