C# 方法语法类似于对象初始值设定项
C# method syntax similar to object initializer
我们有一个扩展方法,它接受一个动作来初始化一个对象。
有没有办法改进这种调用的语法:
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"
);
我想也许我可以使用类似于对象初始化语法的东西?
uow.NewRow<ICustomer>({
Name: "Zzz",
Info: "Abc"
});
想法是在每一行中去掉 customer.* = ...
。
我很乐意提供任何小费。
信息:
- 我们使用的是最新的C#语言版本
- 解决方案应支持 IntelliSense(例如,应向用户建议名称和信息)
编辑:
- 我不能使用构造函数,因为我只有一个接口。没有class/implementation。背后的框架为给定的接口创建对象
T bo = NewRow<T>();
。创建哪个实际对象由框架决定
- 像
{ Name: myOtherVariable.FirstName }
这样的初始化器也应该是可能的
一个Action
可以是一切,而不只是一个简单的赋值。因此,如果客户选择制作 function-call,那么这里实际上没有什么可以走捷径的。例如看这个:
uow.NewRow<IWhatever>(() => Console.WriteLine("tataaaa"););
所以不,你想要的是不可能的。
但是您可以创建某种 EventsArgs
来保存您的名字并在您的 NewRow
方法中使用这些名字。如果所有这些回调实际上应该只是 assignement-calls 一起。
,则无需执行任何操作
uow.NewRow<ICustomer>(new MyArgs {
Name = "Zzz",
Info = "Abc"
});
并在 NewRow
内:
public T NewRow<T>(MyArgs args) where T : IBo
{
customer.Name = args.Name;
customer.Info = args.Info;
}
我们有一个扩展方法,它接受一个动作来初始化一个对象。 有没有办法改进这种调用的语法:
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"
);
我想也许我可以使用类似于对象初始化语法的东西?
uow.NewRow<ICustomer>({
Name: "Zzz",
Info: "Abc"
});
想法是在每一行中去掉 customer.* = ...
。
我很乐意提供任何小费。
信息:
- 我们使用的是最新的C#语言版本
- 解决方案应支持 IntelliSense(例如,应向用户建议名称和信息)
编辑:
- 我不能使用构造函数,因为我只有一个接口。没有class/implementation。背后的框架为给定的接口创建对象
T bo = NewRow<T>();
。创建哪个实际对象由框架决定 - 像
{ Name: myOtherVariable.FirstName }
这样的初始化器也应该是可能的
一个Action
可以是一切,而不只是一个简单的赋值。因此,如果客户选择制作 function-call,那么这里实际上没有什么可以走捷径的。例如看这个:
uow.NewRow<IWhatever>(() => Console.WriteLine("tataaaa"););
所以不,你想要的是不可能的。
但是您可以创建某种 EventsArgs
来保存您的名字并在您的 NewRow
方法中使用这些名字。如果所有这些回调实际上应该只是 assignement-calls 一起。
uow.NewRow<ICustomer>(new MyArgs {
Name = "Zzz",
Info = "Abc"
});
并在 NewRow
内:
public T NewRow<T>(MyArgs args) where T : IBo
{
customer.Name = args.Name;
customer.Info = args.Info;
}