2010-07-29 5 views
15

Gibt es eine Möglichkeit, eine generische Methode zu erstellen, die die new()-Konstruktbeschränkung verwendet, um Klassen mit Konstruktoren bestimmter Typen zu erfordern?C# generische Methoden, geben Sie Parameter in new() Konstruktoreinschränkung ein

Beispiel:

Ich habe den folgenden Code:

public T MyGenericMethod<T>(MyClass c) where T : class 
{ 
    if (typeof(T).GetConstructor(new Type[] { typeof(MyClass) }) == null) 
    { 
     throw new ArgumentException("Invalid class supplied"); 
    } 
    // ... 
} 

Ist es möglich, so etwas wie dieses, anstatt zu haben?

public T MyGenericMethod<T>(MyClass c) where T : new(MyClass) 
{ 
    // ... 
} 

EDIT: Da ist a suggestion in Bezug auf diese. Bitte stimmen Sie ab, damit wir diese Funktion in C# haben können!

+1

Ich bin ein wenig verwirrt. Was genau willst du erreichen? Nimmt der Konstruktor einen Parameter von MyClass oder beschränken Sie T auf MyClass? –

Antwort

28

Nicht wirklich; C# unterstützt nur Konstruktoreinschränkungen ohne Argumente.

Die Abhilfe, die ich für generische arg Konstrukteure verwenden ist der Konstruktor als Delegierter zu spezifizieren:

public T MyGenericMethod<T>(MyClass c, Func<MyClass, T> ctor) { 
    // ... 
    T newTObj = ctor(c); 
    // ... 
} 

dann beim Aufruf:

MyClass c = new MyClass(); 
MyGenericMethod<OtherClass>(c, co => new OtherClass(co)); 
4

Nr einschließen Sie, generische Einschränkungen erlauben nur leider :

where T : new() 

Gibt an, dass es eine default, parameterless con ist Structor. Es gibt keine Möglichkeit, auf einen Typ mit einem Konstruktor zu verweisen, der einen bestimmten Parametertyp akzeptiert.

Weitere Informationen finden Sie unter Constraints on Type Parameters.

+0

Ja, ich habe diesen Artikel gelesen, aber es war nicht sehr spezifisch für die neue() Einschränkung. Danke trotzdem, ich denke, ich werde meine Validierung dort lassen, wo sie ist ... – Meryovi

+0

@Joel: Die Option, die sie zeigen, ist die einzige Option für die neue() Einschränkung. Es gibt keine Möglichkeit, Parameter hinzuzufügen. –

2

Nein, in C# ist es nicht möglich, den generischen Typ auf einen Konstruktor einer bestimmten Signatur zu beschränken. Nur der parameterlose Konstruktor wird von new() unterstützt.

+1

Es wäre aber eine schöne Ergänzung! – Meryovi

Verwandte Themen