Feedback

C# - Diverse Erweiterungsmethoden

Veröffentlicht von am 04.04.2011
(2 Bewertungen)
Ich stelle euch hiermit mal ein paar meiner Erweiterungsmethoden zur Verfügung.
using System.Collections;
using System.Collections.Generic;
using System.Reflection;

namespace Tools
{
    /// <summary>
    /// Stellt eine Reihe von Erweiterungsmethoden zur
    /// Verfügung.
    /// </summary>
    public static class Extensions
    {
        /// <summary>
        /// Kopiert die Eigenschaften eines Objektes
        /// auf ein anderes.
        /// </summary>
        public static T CopyProperties<T>(this T source, T dest)
        {
            foreach (PropertyInfo prop in typeof(T).GetProperties())
            {
                if (prop.CanRead && prop.CanWrite)
                {
                    prop.SetValue(dest, prop.GetValue(source, null), null);
                }
            }

            return dest;
        }

        /// <summary>
        /// Kopiert eine Liste.
        /// </summary>
        public static IEnumerable<T> CopyList<T>(this IEnumerable source)
        {
            List<T> retVal = new List<T>();

            foreach (object obj in source)
            {
                try
                {
                    retVal.Add((T)obj);
                }
                catch { };
            }

            return retVal;
        }

        /// <summary>
        /// Gibt den Index eines Elements zurück.
        /// </summary>
        public static int GetIndexOf<T>(this IEnumerable<T> source, T item)
        {
            int counter = 0;
            foreach (T obj in source)
            {
                if ((object)obj == (object)item)
                    return counter;

                counter++;
            }

            return -1;
        }

        /// <summary>
        /// Zählt die Vorkommnisse eines Objekts in einer Aufzählung.
        /// </summary>
        public static int CountContains<T>(this IEnumerable<T> source, T item)
        {
            int retVal = 0;

            foreach (T obj in source)
            {
                if (obj.Equals(item))
                    retVal++;
            }

            return retVal;
        }
    }
}

Abgelegt unter erweiterungsmethoden, extensions.

2 Kommentare zum Snippet

Christopher Kk schrieb am 04.04.2011:
Hmm also die Methode GetIndexOf find ich nich so gut, nicht umsonst implementiert nur die IList den Indexer, weil IEnumerable halt einfach nur eine Aufzählung ist und wenn man einen Index braucht ist IEnumerable eh die falsche Wahl.

CountContains ist nett, aber dafür gibt es die Extensionmethod Count, der man ein Predicate mitgeben kann.

Die Funktion CopyProperties, macht aber nur ne Flache Kopie, das ist gewollt?

Die Funktion CopyList ist sehr gefährlich. Da einfach die CastException zu schlucken halte ich für sehr unsauberen Stil. Für sowas gibts doch bereits .Cast<T>. Oder aber, du machst deinen Extension Parameter auch T-Generisch. Ansonsten würde ich die Funktion nicht benutzen.
hackman schrieb am 04.04.2011:
naja ist nicht so dolle programmiert

zu CopyProperties,
besser mal schaun ob die getvalue und setvalue funktionen auch wirklich zurückgeliefert werden,

was ist der unterschied zwischen CopyList und ToList, ToArray etc?
warum erstellt die funktion eine liste, wenn ein array reichen würde? das braucht im schlimmsten fall nur etwa doppelt so viel speicher ...
und alle exceptions einfach mal ignorieren, naja ...

indexof, wie wärs mit der richtigen .Equal methode?
oder richtig mit IEqualityComparer implementieren


für ein .Count(t => t == item) braucht man nicht wirklich ne extra funktion?
 

Logge dich ein, um hier zu kommentieren!