对方法返回使用隐式类型语法
本文关键字:类型 语法 方法 返回 | 更新日期: 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(( 的类的属性
不能使用静态或实例方法执行此操作