Manuel Kroiß
Manuel Kroiß

Reputation: 83

C# method syntax similar to object initializer

We have an extension method that accepts an action to initialize an object. Is there some way to improve the syntax of such a call:

public static T NewRow<T>(this IUow uow, Action<T> action();

// this does internally call
public T NewRow<T>(Action<T> initializer) where T : IBo
{
    T bo = NewRow<T>();
    initializer.Invoke(bo);
    return bo;
}

uow.NewRow<ICustomer>(customer => { 
        customer.Name = "Zzz";
        customer.Info = "Abc"
);

I thought maybe I could use something similar to the object initializer syntax?

uow.NewRow<ICustomer>({ 
      Name: "Zzz",
      Info: "Abc"
});

The idea is to get rid of customer.* = ... in every line.

I would be happy for any tip.

INFO:

Edit:

Upvotes: 1

Views: 152

Answers (1)

MakePeaceGreatAgain
MakePeaceGreatAgain

Reputation: 37000

an Action could be everything, not just a simple assignment. So if a client chosed to make a function-call instead, there literally is nothing to shortcut here. See this for example:

uow.NewRow<IWhatever>(() => Console.WriteLine("tataaaa"););

So no, what you want isn't possible.

However you could create some kind of EventsArgs that hold your names and use those within your NewRow-method. There's no need for an action if all those callbacks should actually be just assignement-calls alltogether.

uow.NewRow<ICustomer>(new MyArgs { 
    Name = "Zzz",
    Info = "Abc"
});

And within NewRow:

public T NewRow<T>(MyArgs args) where T : IBo 
{
    customer.Name = args.Name;
    customer.Info = args.Info;
}

Upvotes: 2

Related Questions