我在返回简单对象时习惯了以下语法。它更容易,更短,更清洁,更整洁。
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;
答案 0 :(得分:2)
请参阅此处的MSDN文章here
它表示UserName属性是class,只有一个get访问器。还有一个例子如何设置它的'值 - 你不能用initialzer
这样做编辑:OP评论后: 你不能在初始化程序中设置属性的属性,你必须用旧方法
答案 1 :(得分:0)
您想要设置UserName
属性的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");