-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クラスと関連するタイプはこのように設計されました。

構文を本当に「変更」したい場合、1つのオプションは、拡張メソッドを使用して流暢な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 に答える