title: Fluently setting C# properties and chaining methods
body: <p>I'm using .NET 3.5. We have some complex third-party classes which are automatically generated and out of my control, but which we must work with for testing purposes. I see my team doing a lot of deeply-nested property getting/setting in our test code, and it's getting pretty cumbersome.</p>
  
  <p>To remedy the problem, I'd like to make a fluent interface for setting properties on the various objects in the hierarchical tree. There are a large number of properties and classes in this third-party library, and it would be too tedious to map everything manually.</p>
  
  <p>My initial thought was to just use object initializers. <code>Red</code>, <code>Blue</code>, and <code>Green</code> are properties, and <code>Mix()</code> is a method that sets a fourth property <code>Color</code> to the closest RGB-safe color with that mixed color. Paints must be homogenized with <code>Stir()</code> before they can be used.</p>
  
  <pre><code>Bucket b = new Bucket() {
    Paint = new Paint() {
      Red = 0.4;
      Blue = 0.2;
      Green = 0.1;
    }
  };
  </code></pre>
  
  <p>That works to initialize the <code>Paint</code>, but I need to chain <code>Mix()</code> and other methods to it. Next attempt:</p>
  
  <pre><code>Create&lt;Bucket&gt;(Create&lt;Paint&gt;()
    .SetRed(0.4)
    .SetBlue(0.2)
    .SetGreen(0.1)
    .Mix().Stir()
  )
  </code></pre>
  
  <p>But that doesn't scale well, because I'd have to define a method for each property I want to set, and there are hundreds of different properties in all the classes. Also, C# doesn't have a way to dynamically define methods prior to C# 4, so I don't think I can hook into things to do this automatically in some way.</p>
  
  <p>Third attempt:</p>
  
  <pre><code>Create&lt;Bucket&gt;(Create&lt;Paint&gt;().Set(p =&gt; {
      p.Red = 0.4;
      p.Blue = 0.2;
      p.Green = 0.1;
    }).Mix().Stir()
  )
  </code></pre>
  
  <p>That doesn't look too bad, and seems like it'd be feasible. Is this an advisable approach? Is it possible to write a <code>Set</code> method that works this way? Or should I be pursuing an alternate strategy?</p>