-3

返回简单对象时,我习惯了下面的语法。它更容易、更短、更干净、更整洁。

return Stuff{ Prop1 = "a", Prop2 = 5 };

但是,由于某种原因,我不能ClientCredentials以相同的方式实例化。我想指定UserName属性,但智能感知只是给了我一大堆令人困惑的东西,我不知道该怎么办。而且我要找的房子不在那里。我认为这种语法是推荐的和标准的……什么给出了?

编辑:

我想使用以下语法:

return ClientCredentials
{ 
  UserName.Password = "abc123",
  UserName.UserName = "server\\user"
};

代替:

ClientCredentials clientCredentials = new ClientCredentials();
clientCredentials.UserName.UserName = "server\\user";
clientCredentials.UserName.Password = "abc123";
return clientCredentials;
4

2 回答 2

2

在此处查看 MSDN 文章

它说 UserName 属性是一个只有一个 get 访问器的类。还有一个示例如何设置它的值 - 你不能用初始化器做到这一点

编辑:在 OP 评论之后:你不能在初始化程序中设置属性的属性,你必须用旧的方式来做

于 2012-09-14T12:45:04.883 回答
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");
于 2012-09-14T12:54:52.030 回答