在使用速记样式初始化对象(ClientCredentials)期间设置属性的属性?

时间:2012-09-14 12:35:38

标签: c#

我在返回简单对象时习惯了以下语法。它更容易,更短,更清洁,更整洁。

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;

2 个答案:

答案 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");