Feedback

C# - Der * Operator mal anders...

Veröffentlicht von am 1/22/2010
(3 Bewertungen)
Dieses Beispiel implementiert den *-Operator auf ein klonbares Objekt.

Ein Code nach dem Muster


MyCloneableObject myObj = new MyCloneableObject();

IEnumerable<MyCloneableObject> list = myObj * 5979;


würde eine Liste mit 5979 geklonten Instanzen von myObj zurückgeben, die man bspw. mit der LINQ-Extension ToArray() in ein Array umwandeln kann.

Eine umgekehrte Verwendung wie


MyCloneableObject myObj = new MyCloneableObject();

IEnumerable<MyCloneableObject> list = 5979 * myObj;


ist ebenfalls möglich.
using System;
using System.Collections.Generic;

namespace MarcelJKloubert
{
    public class MyCloneableObject : ICloneable
    {
        #region Methoden
        /// <summary>
        /// 
        /// </summary>
        /// <see cref="System.ICloneable.Clone()"/>
        public object Clone()
        {
            // hier kommt der Code zum klonen des Objektes rein...
        }
        #endregion

        #region Operatoren
        /// <summary>
        /// Erstellt eine gewisse Anzahl von geklonten Objekten.
        /// </summary>
        /// <param name="obj">Objekt, das geklont werden soll.</param>
        /// <param name="count">Anzahl der geklonten Objekte.</param>
        /// <returns>Liste mit geklonten Objekten.</returns>
        /// <exception cref="">Wird geworfen, wenn die Anzahl kleiner als 0 ist.</exception>
        public static IEnumerable<MyCloneableObject> operator *(MyCloneableObject obj, int count)
        {
            if (count < 0)
            {
                throw new ArgumentOutOfRangeException("count");
            }

            for (int i = 0; i < count; i++)
            {
                MyCloneableObject item = obj is MyCloneableObject ?
                                         (MyCloneableObject)obj.Clone() : null;

                yield return item;
            }
        }

        /// <summary>
        /// Erstellt eine gewisse Anzahl von geklonten Objekten.
        /// </summary>
        /// <param name="count">Anzahl der geklonten Objekte.</param>
        /// <param name="obj">Objekt, das geklont werden soll.</param>
        /// <returns>Liste mit geklonten Objekten.</returns>
        /// <exception cref="">Wird geworfen, wenn die Anzahl kleiner als 0 ist.</exception>
        public static IEnumerable<MyCloneableObject> operator *(int count, MyCloneableObject obj)
        {
            return obj * count;
        }
        #endregion
    }
}
Abgelegt unter System, ICloneable, klonbar, klonen, *, operator.

2 Kommentare zum Snippet

Christopher Kk schrieb am 1/24/2010:
Hmm ganz ehrlich gefällt mir das nicht. Ist irgendwie nicht intuitiv für diesen Operator. Da würde ich eher eine Methode machen wo ich die Anzahl der Klone angebe und diese dann eine IEnumerabel<T> zurück gibt.
Koopakiller schrieb am 10/31/2016:
Sonderlich intuitiv finde ich die Operator-Überladung auch nicht. Aber das Snippet zeigt gut was technisch möglich ist, was mir sehr gefällt.
 

Logge dich ein, um hier zu kommentieren!