对方法返回使用隐式类型语法

本文关键字:类型 语法 方法 返回 | 更新日期: 2023-09-27 18:34:35

不知道如何确定如何命名这个问题,所以我希望标题有效。

问题是,我可以在方法调用上使用类似于隐式类型语法的东西吗? 例如,这是我所指的隐式类型语法:

var x = new Y(){Foo = "Bar", Id = 1};

我想做这样的事情:

var x = myInstance.CreateItem(){Foo = "Bar", Id = 1};

C# 中是否有任何内容支持这样的东西? 我不想做:

x.Foo = "Bar";
x.Id = 1;
...

请注意,CreateItem 返回动态类型。 不能修改 CreateItem 方法及其类。

我会满足于类似于 VB 中的 With 语句的东西。

提前谢谢。

更新:尝试Mark Brackett的解决方案产生了以下代码:

TaskItem item = outlook.CreateItem(OlItemType.olTaskItem)._((Action<dynamic>)(i => 
            {
                i.Subject = "New Task";
                i.StartDate = DateTime.Now;
                i.DueDate = DateTime.Now.AddDays(1);
                i.ReminderSet = false;
                i.Categories = "@Work";
                i.Sensitivity = OlSensitivity.olPrivate;
                i.Display = true;
            }));

public static class Extension
{
    public static T _<T>(this T o, System.Action<dynamic> initialize) where T : class
    {
        initialize(o);
        return o;
    }
}

现在唯一的问题是扩展方法似乎没有绑定到 System._ComObject,因为我收到此错误:系统。_ComObject"不包含"_"的定义。

对方法返回使用隐式类型语法

它被称为"对象初始值设定项",不 - 它不可用于返回值(或者实际上,除了 new 语句之外的任何时间(。

语法方面,我能想到的最接近的是使用 Action 委托(这需要更改Builder(:

MyItem CreateItem(Action<MyItem> afterCreate) {
   var i = new MyItem();
   if (afterCreate != null) afterCreate(i);
   return i;
}
var x = Builder.CreateItem(i => { i.Foo = "Bar"; i.Id = 1; });

如果您对常用函数的短方法名称有 JavaScripty 的心情,并且无法更改Builder,我想扩展方法也可以工作:

public static T _<T>(this T o, Action<T> initialize) where T : class {
    initialize(o);
    return o;
}
var x = Builder.CreateItem()._(i => { i.Foo = "Bar"; i.Id = 1; });

这里有一个转折点给你。CreateItem(( 返回一个动态类型

与我的评论相反,dynamic确实需要一些更改。您需要投射到object否则lambda会抱怨,然后您需要将dynamic指定为T否则它将推断为object。或者,创建包含 Action<dynamic> 且没有类型参数的扩展方法。

object CreateItem() {
    return (object)Builder.CreateItem();
}
public static dynamic __(this object o, Action<dynamic> initialize) {
    initialize(o);
    return o;
}
var x = CreateItem().__(i => { i.Foo = "Bar"; i.Id = 1; });

您可以在工厂方法中使用命名参数:

public static Y Builder.CreateItem(string foo = "", int bar = 0)
{
    return new Y() {Foo = foo, Bar = bar};
}
// called like so:
var x = Builder.CreateItem(Foo: "Bar", Id: 1);

您可以在类的构造函数中指定"公共属性",但不能使用方法执行此操作

因为

  • 此规则仅适用于方法无法实现的成员属性

  • 你不能在方法的字段中给出公共修饰符,所以根本没有可能

当你这样做时

var a = new MyClass{Foo="",Id=""};

您正在定义此构造函数 MyClass(( 的类的属性

不能使用静态或实例方法执行此操作