TokugawaTakeshi / CrossPlatformOrganizerAppplication

0 stars 0 forks source link

拡張静的メソッドを追加 #30

Closed TokugawaTakeshi closed 1 year ago

TokugawaTakeshi commented 1 year ago

Stringクラスの拡張静的メソッドを追加したいと思います。

public static class StringExtensions
{

  public static bool IsNonEmpty(this string self)
  {
    return !String.IsNullOrEmpty(self);
  }

}

だと、実装のところに「static」があっても、実は非静的メソッドの実装であり、String.IsNonEmpty()の様に呼び出す事ができません。 String.IsNonEmpty("テスト")の様に呼び出せる様になるには、どうすれば良いですか?

とこで、

public partial class CompoundControlShell : ComponentBase
{

  [Parameter]
  public string? Label { get; set; }

  // ...
}

の場合、Label.IsNonEmpty()を呼び出してみると、

Possible 'null' assignment to non-nullable entity

と言われますから、IsNonEmptyを静的にしないといけません。 どちらにせよ、静的拡張メソッドを追加出来る様になりたいです。

gummoni commented 1 year ago

拡張メソッドは、拡張する型にメソッドを加える手法です。 今回の場合はstring型にIsNonEmptyメソッドを追加するので、使い方は

string message = "文字";

bool result = message.IsNonEmpty();

というような使い方になります。

String.IsNonEmpty("テスト")の「String」部分は インスタンスではなく静的クラスなので、拡張メソッド的な呼び出し方をすると

bool result = "テスト".IsNonEmpty();

になります。

TokugawaTakeshi commented 1 year ago

@gummoni

説明、ありがとう。 済みません、良く理解できなかったのですが、どうやって実装すれば、String.IsNonEmpty()が呼び出せるようになりますか? この課題だと、message.IsNonEmpty()"テスト".IsNonEmpty()ではなく、String.IsNonEmpty()という使い方の実装は目的です。

gummoni commented 1 year ago

①拡張メソッドは、インスタンスに対してメソッドを追加するもので、 Stringクラスに新しいメソッドを追加する事は現在のC#仕様では行えない状況です。

public static class StringExtensions
{
  public static bool IsNonEmpty(this string self)
  {
    return !String.IsNullOrEmpty(self);
  }
}

//この拡張メソッドは、stringインスタンス経由で利用可能です。
string message = "sample";
message.IsNonEmpty();   //拡張メソッド利用パターン

//------------------------------------------------------------------------------------

//②既存クラスStringにメソッドを追加することは現在のC#仕様では記述できません。

String.IsNonEmpty("sample");  //この書き方はNot OK

//------------------------------------------------------------------------------------

//③上記のような書き方をするには新たなクラスを用意する必要があります。

public static class StringEx {
  public static bool IsNonEmpty(this string self)
  {
    return !String.IsNullOrEmpty(self);
  }
}

StringEx.IsNonEmpty("sample");  //この書き方はOK
TokugawaTakeshi commented 1 year ago

上記、承知しました。 ありがとう。