10 Stimmen

C#-Äquivalent für C++-Makros und Verwendung von Auto<>-Eigenschaften

Ich habe einige Auto-Instantiation-Code, die ich auf etwa 15 Eigenschaften in einer ziemlich großen Klasse anwenden möchte. Der Code ist ähnlich wie der folgende, aber die Typ ist anders für jede Instanz:

protected ComplexType _propertyName;
public ComplexType PropertyName
{
    get
    {
        if (_propertyName == null) {
            _propertyName = new ComplexType();
        }

        return _propertyName;
    }
}

Um dies in C++ zu wiederholen (da es ~15 Instanzen gibt), hätte ich eine Präprozessormakro aber ich habe festgestellt, dass C# sie nicht unterstützt.

Ich frage mich, wenn jemand eine Empfehlung, wie man dies sauber in C# tun hat?

1voto

Rytmis Punkte 30606

Sie könnten die träge Initialisierung auf eine ähnliche Weise implementieren:

  public class Lazy<T> where T : new()
   {
       private T _value;
       private bool _isInitialized;

       private T GetValue()
       {
           if (!_isInitialized)
           {
               _value = new T();
               _isInitialized = true;
           }

           return _value;
       }

       public static implicit operator T (Lazy<T> t)
       {
           return t.GetValue();
       }
   }

die es Ihnen ermöglichen würde, Code wie diesen zu schreiben:

      private Lazy<ComplexType> _lazyCt = new Lazy<ComplexType>();
      public ComplexType LazyCt
      {
          get { return _lazyCt; }
      }

Die Einzelheiten der Initialisierung sind irrelevant, ich habe es so geschrieben, um zu zeigen, dass man es transparent in die nicht-lazy Version konvertieren kann und die Initialisierung bei der ersten Konvertierung durchführen kann :)

0voto

Vitaliy Ulantikov Punkte 9549

Versuchen Sie zu verwenden Hashtabelle ou Wörterbuch <string, ComplexType> um alle Eigenschaften zu gruppieren. Etwas wie dies:

protected Dictionaty<string, ComplexType> _properties = new Dictionaty<string, ComplexType>();
public ComplexType Property(string name)
{
    get
    {
        if (!properties.ContainsKey(name))
            _properties[name] = new ComplexType();

        return __properties[name];
    }
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X