Question

Simple question, je l'espère une réponse simple:

Je voudrais faire ce qui suit:

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
}

Ce qui précède est juste un exemple de ce que je suis en train de faire. Je voudrais avoir un accesseur public à une variable interne de type x. Je veux l'obtenir cette variable comme une chaîne, mais les régler en utilisant quelque chose de type x.

Est-ce possible?

- modifier -

Je viens de réaliser que je pouvais faire quelque chose comme:

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
}

Mais alors, laissez-dire que j'utiliser le type y au lieu d'une « chaîne » comme mon type « get ». Si je veux utiliser « DateTimeProperty » autre où dans mon code, je dois le jeter.

Était-ce utile?

La solution

Non. Vous pouvez évidemment ajouter le .ToString () dans le code d'appel, mais vous ne pouvez pas faire ce que vous proposez sans noms différents comme ceci:

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

Ou, mieux encore d'utiliser des méthodes non des propriétés (comme indiqué dans les commentaires):

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

Gardez à l'esprit que var est pour implicitement , la compilation tapé var iables, pas dynamique les variables.

Certainement ne pas faire ce que vous avez noté dans votre édition. Il a introduit une rupture dans la convention, les conséquences possibles de la performance (quoique légère), et des problèmes de localisation importants.

Autres conseils

En tant que propriété, pas cela est impossible. Vous pouvez faire et ECRIRE méthodes qui sont de différents types, mais une propriété les types doivent être identiques.

EDIT:

Bien:

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
}

est syntaxiquement correct, compilera et vous permet d'accepter DateTime en entrée et renvoyer une chaîne, ce ne serait pas un bon plan. Il fonctionne, mais il vous fait et toute personne accédant à ce code, effectuer la validation non nécessaire. De plus, il est vulnérable à un autre développeur à l'avenir, ne sachant pas, ou la réalisation des règles implicites, pour lequel vous avez perdu la sécurité de compilation. De plus, sa peine plus de code pour créer soit deux propriétés, ou deux méthodes qui permettent d'atteindre le même but, d'une manière fortement typé.

Personnellement, je recommande d'utiliser deux méthodes (voir le commentaire Jeff Yates pour une bonne explication pour expliquer pourquoi).

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

public void SetDateTime(DateTime dateTime)
{
    m_internalDateTime = dateTime;
}

Pas de cette façon, mais vous pouvez certainement avoir une deuxième propriété qui accède au champ m_internalDateTime.

public string DateTimeString
{
   get { return m_internalDateTime.ToString(); }
}

Peut-être aide

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;
}

Réponse simple non, à votre code en dehors de votre propriété se comportera de la manière exacte qu'un champ serait, vous ne pouvez pas avoir une propriété ayant différents set / get types comme vous ne pourriez pas avoir un dépôt être réglé avec un type et quand vous demandez sa valeur obtenir un retour de type différent.

Que diriez-vous:

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);           
      } 
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top