繁体   English   中英

C# 方法语法类似于 object 初始化程序

[英]C# method syntax similar to object initializer

我们有一个扩展方法,它接受一个初始化 object 的操作。 有没有办法改进这种调用的语法:

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"
);

我想也许我可以使用类似于 object 初始化器语法的东西?

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

这个想法是在每一行中摆脱customer.* =...

我会很高兴任何提示。

信息:

  • 我们使用的是最新的C#语言版本
  • 解决方案应支持 IntelliSense(例如,应向用户建议名称和信息)

编辑:

  • 我不能使用构造函数,因为我只有一个接口。 没有类/实现。 后面的框架创建 object 到给定的接口T bo = NewRow<T>(); . 实际创建的 object 由框架决定
  • { Name: myOtherVariable.FirstName }这样的初始化程序也应该是可能的

一个Action可以是一切,而不仅仅是一个简单的分配。 因此,如果客户选择进行函数调用,那么这里实际上没有什么可以捷径的。 例如看这个:

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

所以不,你想要的是不可能的。

但是,您可以创建某种EventsArgs来保存您的姓名并在您的NewRow方法中使用这些名称。 如果所有这些回调实际上应该只是全部的赋值调用,则无需执行任何操作。

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;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM