gpt4 book ai didi

c# - 在方法返回上使用隐式类型语法

转载 作者:行者123 更新时间:2023-11-30 16:24:38 24 4
gpt4 key购买 nike

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

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

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

}

现在唯一的问题是扩展方法似乎没有绑定(bind)到 System._ComObject 因为我得到这个错误:System._ComObject' does not contain a definition for '_' .

最佳答案

它叫做 "object initializer" , 不 - 它不可用于返回值(或者实际上,除了使用 new 语句之外的任何时间)。

在语法方面,我能想到的最接近的语法是使用 Action委托(delegate)(需要更改 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; });

如果您对常用函数的简短方法名称感兴趣,并且无法更改 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; });

Here's a twist for you. CreateItem() returns a dynamic type

与我的评论相反,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; });

关于c# - 在方法返回上使用隐式类型语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10660353/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com