如何使用 C#6 来缩短重复的声明和初始化?

How can I use C#6 to shorten repeated declarations and initialization?

我简化了下面的示例代码来演示这个问题。单个 Page 个对象可以有 N 个 Element 个对象,理论上可能有数百个。为了使代码尽可能易于维护,我想问是否有一种方法可以声明每个 Element 并在同一行对其进行初始化。

我的第一次尝试是B,但这是annoying/tedious,因为我必须在一个地方声明Element,然后在class.

的单独部分中的构造函数

下一次尝试,我目前使用的方法是A。每个 Element 的代码比 B 多一点,但它是一个地方。另一个优点(在我的情况下)是 Element 对象实际上并没有被创建 until/if 它是需要的。缺点(在我看来,这种方法)是当有 20 多个 Element 属性时,文件仍然很长而且全部是 copy/paste.

我正在寻找一种在一行中声明和初始化每个 Element 的方法(如果它可以是像 A 这样的单例,那将是一个奖励) . C 是一个我可以接受但由于显而易见的原因实际上没有编译的示例。有没有办法缩短 B 或以更短、更清晰的方式重写它,并可能使用一些新的 C#6 功能?


public class Authorization
{
}

public class Element
{
    private Authorization _authorization;

    public Element(Authorization authorization)
    {
        _authorization = authorization;
    }
}

public class Page
{
    private Authorization _authorization;

    public Page(Authorization authorization)
    {
        _authorization = authorization;

        ElementTwo = new Element(_authorization);
    }

    // A
    private Element _elementOne;
    public Element ElementOne => _elementOne ?? (_elementOne = new Element(_authorization));

    // B
    public Element ElementTwo { get; private set; }

    // C - Ideal
    // A field initializer cannot reference the non-static field, method, or property 'Page.Authorization'
    // Cannot access non-static field Authorization in static context
    public Element ElementThree { get; } = new Element(_authorization);
}

您可以使用字典和方法吗?如果 [CallerMemberName] 不起作用,请不要开枪,我没有编译这段代码。

public class Page {

  private readonly Authorization _auth;
  private readonly IDictionary<string, Element> _elements = new Dictionary<string, Element>();

  public Element ElementOne => GetOrCreateElement();
  public Element ElementTwo => GetOrCreateElement();
  public Element ElementThree => GetOrCreateElement();

  public Page(Authorization auth) {
    _auth = auth;
  }

  private Element GetOrCreateElement([CallerMemberName] string name = null) {
    if(_elements.TryGetValue(name, out var returnElement)) 
      return returnElement;
    var element = new Element(_auth);
    _elements.Add(name, element);
    return element;
  }

}