Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Creating an object passing a lambda expression to the constructor

I have an object with a number of properties.

I want to be able to assign some of these properties when I call the constructor.

The obvious solution is to either have a constructor that takes a parameter for each of the properties, but that's nasty when there are lots. Another solution would be to create overloads that each take a subset of property values, but I could end up with dozens of overloads.

So I thought, wouldn't it be nice if I could say..

MyObject x = new MyObject(o => o.Property1 = "ABC", o.PropertyN = xx, ...);

The problem is, I'm too dim to work out how to do it.

Do you know?

like image 916
Stuart Hemming Avatar asked Feb 20 '26 11:02

Stuart Hemming


1 Answers

C# 3 allows you to do this with its object initializer syntax.

Here is an example:

using System;

class Program
{
    static void Main()
    {
        Foo foo = new Foo { Bar = "bar" };
    }
}

class Foo
{
    public String Bar { get; set; }
}

The way this works is that the compiler creates an instance of the class with compiler-generated name (like <>g__initLocal0). Then the compiler takes each property that you initialize and sets the value of the property.

Basically the compiler translates the Main method above to something like this:

static void Main()
{
    // Create an instance of "Foo".
    Foo <>g__initLocal0 = new Foo();
    // Set the property.
    <>g__initLocal0.Bar = "bar";
    // Now create my "Foo" instance and set it
    // equal to the compiler's instance which 
    // has the property set.
    Foo foo = <>g__initLocal0;
}
like image 95
Andrew Hare Avatar answered Feb 24 '26 14:02

Andrew Hare



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!