Frage

Diese Frage hat hier bereits eine Antwort:

Ich habe eine Sammlung von Objekten, die ich als Parameter übergeben habe, um Objekte eines anderen Typs zu erstellen (eine für einen). Ich mache dies an vielen Orten (weshalb ich grundsätzlich von Datenobjekten in Geschäftsobjekte konvertiere). Ich möchte eine generische Erweiterungsmethode schreiben, um dies zu erreichen. Aber ich stecke fest, weil ich nicht weiß, wie ich die Einschränkung angeben kann, dass Business -Objekt einen Konstruktor hat, der Datenobjekt als Parameter nimmt. Im Folgenden finden Sie Code meiner Funktion:

public static IList<T> ConvertTo<A,T>(this IEnumerable<A> list) 
                    where T : new(A)/*THIS IS PROBLEM PART*/
{
    var ret = new List<T>();

    foreach (var item in list)
    {
        ret.Add(new T(item));
    }
    return ret;
}
War es hilfreich?

Lösung

Leider ist dies in C#nicht erlaubt. Sie können eine haben new() Einschränkungen, die den Typ zwingen, einen Standardkonstruktor zu haben, ist jedoch die einzige Konstruktorbeschränkung, die von .NET unterstützt wird.

Ihre beste Option ist es wahrscheinlich, eine Schnittstelle zu definieren, die Sie verwenden und die Schnittstelle beschränken können. Anstatt zu versuchen, das Objekt auf der Konstruktion festzulegen, können Sie eine "initialisierende" Stilmethode haben, die das "A" -Objekt annimmt, und das aufrufen.

Andere Tipps

Sie können generische Konstruktoren auf diese Weise nicht einschränken (nur um einen parameterlosen Konstruktor zu erfordern), aber Sie könnten einen Delegierten für die Konstruktion nehmen:

public static IList<T> ConvertTo<A, T>(this IEnumerable<A> list, Func<A, T> constructionFunc)
{
    return list.Select(constructionFunc).ToList();
}

Und benutze es so:

var IList<T> converted = someSequence.ConvertTo(a => new T(a));
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top