0

次のように、内部にパブリック プロパティを持つクラスがあるとします。

class Data
{
    public int Property { get; set; }
}

さて、何らかの理由で、このプロパティに文字列を渡したいと思います。渡す前に文字列を に変換することもできますInt32が、怠け者の方が簡単です。変換が自動的に行われるようにセッターを変更することは可能ですか? 次のように:

if (value is string) Property = Int32.Parse(value);

もちろん、この例は機能しません。VS はエラーと、値が決して文字列にならないことに関する警告をスローします。

編集:はい、これが悪い考えであることは知っています。これはただの好奇心です。

4

4 に答える 4

3

変換を避けたい場合は、プロパティセッターを使用する代わりに、セッターメソッドを作成できます。

void SetProperty(int value);
void SetProperty(String value);

等々。

本当にワイルドになりたい場合はPropertyValue、int、文字列、その他必要なタイプから暗黙的に変換されたタイプを作成し、それをプロパティタイプとして使用できます。セッターは希望どおりに動作しますが、ゲッターに問題が発生します。これらの変換を本当に保存したい場合は、最初のソリューションを使用してください。

于 2012-05-14T15:17:16.360 に答える
3

この方法でセッターを変更することはできません。C#のプロパティのセッターは、プロパティ自体と同じタイプである必要があります。セッターの関数として、他のタイプからの静的変換を挿入する方法はありません。

于 2012-05-14T15:18:07.537 に答える
2

いいえ、言語仕様に従って、プロパティを何らかの type として宣言するTと、コンパイル時に(またはその派生型の 1 つまたは interface を実装する型) であるvalueことが保証されます。TT

セッターが任意の型の値を受け取りたい場合は、次を使用しますobject

private int prop;

public object Property
{
    get { return this.prop; }
    set
    {
        this.prop = value != null ? Int32.Parse(value.ToString()) : 0;
    }
}
于 2012-05-14T15:22:32.090 に答える
0

次のタイプのプロパティを使用できますobject

class Data {
  private int _property;
  public object Property {
    get {
      return _property;
    }
    set {
      if (value is string) {
        _property = Int32.Parse(value);
      } else {
        _property = (int)value;
      }
    }
  }
}

ただし、これはあまり実用的ではありません。をintプロパティに割り当てると、暗黙的に にボックス化され、ボックス化されなくなりますobject。値を取得すると、ゲッターはintボックス化された を返すため、値objectとして使用する場合はボックス化を解除 (キャスト) する必要がありintます。

于 2012-05-14T15:21:00.793 に答える