24

簡単な質問、うまくいけば簡単な答え:

次のことをしたいのですが。

private DateTime m_internalDateTime;
public var DateTimeProperty
{
   get { return m_internalDateTime.ToString(); } // Return a string
   set { m_internalDateTime = value; } // here value is of type DateTime
}

上記は私がやろうとしていることのほんの一例です。x型の内部変数へのパブリックアクセサーが欲しいのですが。その変数を文字列として取得したいのですが、x型のものを使用して設定します。

これは可能ですか?

- 編集 -

私はちょうど私が次のようなことをすることができることに気づきました:

private DateTime m_internalDateTime;
public object DateTimeProperty
{
   get { return m_internalDateTime.ToString(); } // Return a string
   set { m_internalDateTime = (DateTime)value; } // here value is of type DateTime
}

しかし、次に、「get」型として「文字列」の代わりにタイプyを使用するとします。コード内のどこかで「DateTimeProperty」を使用したい場合は、それをキャストする必要があります。

4

6 に答える 6

13

いいえ。呼び出し元のコードに.ToString()を追加することはできますが、次のような別の名前がないと、提案したことを実行できません。

private DateTime m_internalDateTime;
public DateTime SetDateTime { set { m_internalDateTime = value; } }
public string GetDateTime   { get { return m_internalDateTime.ToString(); } } 

または、(コメントに記載されているように)プロパティの代わりにメソッドを使用することをお勧めします。

private DateTime m_internalDateTime;
public void SetDateTime(DateTime dateTime) { m_internalDateTime = dateTime; }
public string GetDateTime() { return m_internalDateTime.ToString(); }

これは、動的変数ではなく、暗黙的にコンパイル時に型指定varれた変数用であることに注意してください。

編集で書き留めたことは絶対にしないでください。これにより、慣例の破綻、パフォーマンスへの影響の可能性(わずかではありますが)、および重大なローカリゼーションの問題が発生しました。

于 2009-06-09T18:34:26.253 に答える
6

プロパティとして、これは不可能です。異なるタイプのGetメソッドとSetメソッドを作成できますが、プロパティの場合、タイプは同じである必要があります。

編集:

その間:

private DateTime m_internalDateTime;
public object DateTimeProperty
{
   get { return m_internalDateTime.ToString(); } // Return a string
   set { m_internalDateTime = (DateTime)value; } // here value is of type DateTime
}

構文的に正しく、コンパイルされ、DateTimeを入力として受け入れ、文字列を返すことができます。これは適切な計画ではありません。それは機能しますが、あなたとこのコードにアクセスする人は、不要な検証を実行します。さらに、将来、コンパイル時の安全性を失った暗黙のルールを知らない、または実現しない別の開発者に対して脆弱になります。さらに、強く型付けされた方法で2つのプロパティ、または同じ目標を達成する2つのメソッドを作成するコードはほとんどありません。

個人的には、2つの方法を使用することをお勧めします(理由については、Jeff Yatesのコメントを参照してください)。

private DateTime m_internalDateTime;
public string GetDateTime()
{
    return m_internalDateTime.ToString();
}

public void SetDateTime(DateTime dateTime)
{
    m_internalDateTime = dateTime;
}
于 2009-06-09T18:33:19.407 に答える
4

そうではありませんが、m_internalDateTimeフィールドにアクセスする2番目のプロパティを確実に持つことができます。

public string DateTimeString
{
   get { return m_internalDateTime.ToString(); }
}
于 2009-06-09T18:33:47.657 に答える
3

多分それは役立ちます

public class TDecimal
{
    private decimal? m_value;
    public bool HasValue { get { return m_value.HasValue; } }
    public decimal Value { get { return m_value.Value; } }

    public static implicit operator TDecimal(string a_value)
    {
        decimal d;
        if (decimal.TryParse(a_value, out d))
        {
            return new TDecimal() {m_value = d};
        }

        return new TDecimal() {m_value = null};
    }

    public static implicit operator decimal(TDecimal a_value)
    {
        if(a_value.HasValue)
        {
            return a_value.Value;
        }

        throw new ArgumentNullException("a_value");
    }
}

public class A
{
    public TDecimal Prop { get; set; }
}


A a = new A();

a.Prop = "123";
if (a.Prop.HasValue)
{
    decimal d = a.Prop;
}
于 2010-03-25T12:26:38.470 に答える
0

簡単な答えはありません。外部コードに対して、プロパティはフィールドとまったく同じように動作します。ファイルにタイプを設定することができなかったのと同じように、異なるset/getタイプを持つプロパティを作成することはできません。値が別のタイプを取り戻すように要求します。

于 2009-06-09T18:36:42.240 に答える
0

どうですか:

private DateTime intDT;
public string DateTimeProperty
{   
      get { return intDT.ToString(); } // Return a string   
      set 
      { 
         DateTime dt;
         if (DateTime.TryParse(value, out dt))
             intDT = dt;
         else throw new ArgumentException(string.Format(
           "{0} cannot be converted to a DateTime.", value);           
      } 
}
于 2009-06-09T20:11:45.073 に答える