我想要设计一些小框架,框架主类的内部有一些框架内的对象类型的字段初始化配置,我要使用链式调用的方式来初始化配置类实例的字段。但是我不想在初始化时配置对象字段还必须写这些对象字段的类名。
java,c#的类实例初始化器要写类型的名称,这是我不喜欢的,现在有什么语法糖能在初始化一个类的实例时,避免初始化该类的内部对象字段暴露这些字段的所属类名?只需要凭借 ide 软件的代码提示功能来"点"出属性名就可以。
现在我知道有一个方式,就是利用无返回值的委托,可以在初始化内部对象字段时不用暴露类型名称,c#演示代码如下: 假设 Person 是我们要是使用 new 出的小框架使用的主类,stu 是 Person 的一个私有成员,类型是 Student 。Person 类有以下方法
public Person setStu(Action<Student> o){
stu=new Student();
o(stu);
return this;
}
使用演示 Person p=new Person().setStu((o)=>{o.name="学生名称";o.stuId="123"});
这是一个链式调用结合函数式编程来配置类的内部对象字段的方式。没有暴露内部成员的类型名。
除了这个还有其他的初始化语法糖的写法么?如果要初始化配置一个类的字段的字段成员。要怎么弄比较好
1
aguesuka 2020-06-27 12:30:41 +08:00 via Android
builder 模式,静态工厂,java 的 socket 里还有个 serOption,不知道叫啥模式
|
2
tanranran 2020-06-27 14:13:39 +08:00
1 、目前没有这种语法糖
2 、建造者模式就可以满足你的需求 3 、java 、c# 通用 |
3
winnerczwx 2020-06-27 16:05:03 +08:00
internal static class Program
{ private static void Main(string[] args) { var person = Person.Create("张三", 123); } } public class Student { public string Name { get; set; } public int StuId { get; set; } } public class Person { private Student Student { get; set; } private Person(){} public static Person Create(string name, int id) => new Person { Student = new Student { Name = name, StuId = id } }; } |
4
winnerczwx 2020-06-27 16:08:00 +08:00
|
5
jiangzm 2020-06-27 16:34:07 +08:00
既然是链式你举的例子有问题,应该用 Func 而不是 Action 。
你无非就是想省掉初始化的类名,在 C# 9.0 已经有'new()'这种语法糖了。 比如原来这样写:Person p=new Person() { stu = new Student() }; 在 C#9.0 这样写: Person p=new Person() { stu = new () }; PS: 请注意区分以前的 new{} 匿名对象(动态生成 Class ),和 new() 类型推导语法糖 |
6
tctc4869 OP @jiangzm 这的确可以,但是,如果但是框架内部不一定是自定义对象,可能是原生对象或集合,这些字段不能暴露给外界。
|
7
charlie21 2020-06-27 17:41:38 +08:00 via iPhone
@winnerczwx 请问你这个 usages 和 exposing API 的提示怎么来的?
|
8
MarkLeeyun 2020-06-27 18:36:35 +08:00
@winnerczwx 这是 c#吗??
|
10
winnerczwx 2020-06-27 18:45:14 +08:00 via iPhone
@charlie21 ide 自带的
|
11
winnerczwx 2020-06-27 18:45:28 +08:00 via iPhone
@MarkLeeyun 是
|
12
forgottencoast 2020-06-27 20:29:55 +08:00
楼主可以看看 Asp.Net Core 的初始化部分代码,几乎都是这种形式。
|
13
charlie21 2020-06-27 21:34:16 +08:00
@winnerczwx 请问是啥 IDE / 插件 什么的,VS 2019 吗
|
15
poorcai 2020-06-27 23:26:37 +08:00 via iPhone
@winnerczwx #4 这是什么 ide 啊?另外系统好像不是 windows 的样子
|