2017-05-05 2 views
1

Hier einen Dummy-Code mein Problem verwenden erstellen zu erklären:Dynamisch einen generischen Typen, der den Typen selbst als generischer Parameter

public class A<TX, TA> where TA : A<TX, TA> 
{ 

} 

public void Do() 
{ 
    var doy = typeof(A<,>).MakeGenericType(typeof(string), null/*??????*/)); 
} 

Wie kann ich eine Art von meiner gattungsgemäßen Art zu machen, wenn ich nicht identifty kann meine Typ um es als Parameter zu verwenden?

Danke für Ihre Hilfe.

bearbeiten, Beispiel statisch tun:

public abstract class A<TX, TA> where TA : A<TX, TA> 
{ 
    public TA ChainMethod() 
    { 
     return (TA)this; 
    } 
} 

public class AConcrete : A<string, AConcrete> 
{ 
    public AConcrete OtherMethod() 
    { 
    return this; 
    } 
} 

public class App 
{ 
    public static void Start() 
    { 
    new AConcrete().ChainMethod().ChainMethod().OtherMethod(); 
    } 
} 
+0

Wenn dies das CRTP ist - es wird wirklich hässlich werden; Wie würdest du es in C# ausdrücken? 'A

+1

Sie können nicht. Aber das Hinzufügen von "dynamisch" ist ein Ablenkungsmanöver - es gibt keine Möglichkeit, dies * statisch * zu tun. 'A ' - wie soll ich das "???" erweitern? Es muss irgendwo eine Basis geben. Die Klasse selbst ist legal, aber Sie benötigen mindestens eine andere Klasse, um sie zu starten. [Eric Lipperts Kommentare] (https://blogs.msdn.microsoft.com/ericlippert/2011/02/03/curiousser-and-curiouser/), dass dies verwirrend ist und möglicherweise nicht das erreicht, was Sie wollen, bleibt trotzdem gültig. –

+0

Können Sie eine höhere Anforderung erklären? – Andrei

Antwort

0

Sie benötigen eine Klassenhierarchie zu entwerfen. Es scheint, als wäre es noch nicht ganz da. Bitte lesen Sie in diesem Beispiel aus, hoffen, dass es Ihnen eine Idee geben:

abstract class BaseBuilder<TBrick> 
{ 
    public BaseBuilder<TBrick> AddBrick(TBrick brick) 
    { 
     // ... 
     return this; 
    } 
} 

class Builder : BaseBuilder<ConcreteBrick> 
{ 
    public Builder AddRoof() 
    { 
     // ... 
     return this; 
    } 

    public new Builder AddBrick(ConcreteBrick brick) 
    { 
     base.AddBrick(brick); 
     return this; 
    } 
} 

Und es wird wie folgt aussehen:

new Builder() 
    .AddBrick(new ConcreteBrick()) 
    .AddBrick(new ConcreteBrick()) 
    .AddRoof(); 

Ich denke, Sie werden nicht mit Vererbung Kette Anrufe können, wenn Sie überschreiben Sie keine Methoden mit new Schlüsselwort wie ich vorgeschlagen habe. Obwohl Sie Dinge leicht implementieren können, wenn Sie eine Idee der Verkettung von Anrufen aufgeben.

+0

Es gibt keine Vererbung in Ihrer Probe. – Manofgoa

+0

Nice versuchen mit Ihrer Bearbeitung, aber AddRoof() kann nicht aufgerufen werden, weil der Rückgabetyp von AddBrick() BaseBuilder ist, nicht "Builder" :) – Manofgoa

+0

@Manofgoa guter Punkt, lassen Sie mich für eine Minute denken – Andrei

Verwandte Themen