C# 设置属性';使用速记样式初始化对象(ClientCredentials)期间的属性?
当返回简单对象时,我习惯了下面的语法。它更容易、更短、更干净、更整洁C# 设置属性';使用速记样式初始化对象(ClientCredentials)期间的属性?,c#,C#,当返回简单对象时,我习惯了下面的语法。它更容易、更短、更干净、更整洁 return Stuff{ Prop1 = "a", Prop2 = 5 }; 但是,由于某些原因,我无法以相同的方式实例化ClientCredentials。我想指定UserName属性,但intellisense只是给了我一个巨大的混乱列表,我不知道该怎么办。我要找的房子不在那里。我认为语法是推荐的和标准的。。。有什么好处 编辑: 我想使用以下语法: return ClientCredentials { UserN
return Stuff{ Prop1 = "a", Prop2 = 5 };
但是,由于某些原因,我无法以相同的方式实例化ClientCredentials
。我想指定UserName
属性,但intellisense只是给了我一个巨大的混乱列表,我不知道该怎么办。我要找的房子不在那里。我认为语法是推荐的和标准的。。。有什么好处
编辑:
我想使用以下语法:
return ClientCredentials
{
UserName.Password = "abc123",
UserName.UserName = "server\\user"
};
而不是:
ClientCredentials clientCredentials = new ClientCredentials();
clientCredentials.UserName.UserName = "server\\user";
clientCredentials.UserName.Password = "abc123";
return clientCredentials;
请参阅此处的MSDN文章
它说UserName属性是一个只有get访问器的属性。还有一个例子是如何设置它的值-你不能用initialzer来做这件事
编辑:在OP评论之后:
您不能在初始值设定项中设置属性的属性,您必须使用旧方法来设置
ClientCredentials.UserName
属性,这会使它有些混乱。但是,很容易将其封装到方法中:
ClientCredentials CreateClientCredentials(String userName, String password) {
var clientCredentials = new ClientCredentials();
clientCredentials.UserName.UserName = userName;
clientCredentials.UserName.Password = password;
return clientCredentials;
}
这种语法是不能更改的。ClientCredentials
类和相关类型的设计如下
如果您真的想“修改”语法,一个选项是使用扩展方法创建一个流畅的API,在某些情况下,它允许您在代码中创建小型嵌入式DSL。对于这种特殊情况,我认为没有好的解决方案,但作为一种启发,我在这里提供了一些扩展方法:
public static class ClientCredentialsExtensions {
public static ClientCredentials WithUserName(
this ClientCredentials clientCredentials, String userName) {
// Argument checking omitted.
clientCredentials.UserName.UserName = userName;
return clientCredentials;
}
public static ClientCredentials WithPassword(
this ClientCredentials clientCredentials, String password) {
// Argument checking omitted.
clientCredentials.UserName.Password = password;
return clientCredentials;
}
}
然后您可以这样使用它:
var clientCredentials = new ClientCredentials()
.WithUserName("username")
.WithPassword("password");
但是,我认为没有比这更好的了:
var clientCredentials = new CreateClientCredentials("username", "password");
你能展示更多你想要做/完成的代码吗?
returnclientcredentials{UserName=}代码>谢谢你重新格式化。我自己也看到了,所以我和你同时改变了它。我应该看一下预览…我想在用户名
对象中设置用户名
属性(我知道,它的名称很混乱)…您不能在初始值设定项中设置属性的属性,您必须用旧方法来设置它。。。我确实害怕但不想听的答案。。。将它设置为一个答案(最好是带有一些信息链接),这样我就可以绿色检查你了。无论如何,我不希望像那样运行初始值设定项,而不是使用专门的工厂方法和/或构造函数来显式地要求和处理它们。在上面的示例中,您将在创建ClientCredentials
对象的任何位置复制用户名/密码分配,依赖于它们的username
属性,如果需要,请记住同时分配用户名和密码。通过将这些作为字符串输入参数放置在构造函数/工厂方法中,所有这些都会消失。编辑:任何后续的重构、用法查找等都非常容易。这就是我在问题中所说的。我的问题是我更喜欢紧凑的即时创建和初始化风格。