2016-05-31 21 views
0

Ich versuche, einige Testdaten mit NBuilder für die Automatisierung für alle Klassen zu generieren, die eine Basisklasse erweitert, wobei jede Klasse verschiedene Felder haben wird.Wie abgeleitete Klasse mit C# Generics zurückgegeben

meinen Code Hier ist:

public interface Interface 
{ 
    T method<T>() where T : BaseClass; 
} 

public class DrivedClass: BaseClass,Interface 
{ 
    public T method<T>() where T : BaseClass 
    { 
     var derviedObj = Builder<DrivedClass>.CreateNew().Build(); 

     return derviedObj; 
    } 
} 

return derviedObj geben Fehler nicht implizit konvertieren derviedObj-T

+0

Da die Methode einen offenen Typ T verwendet, müssen Sie eine Instanz dieses Typs anstelle der Instanz eines konkreten Typs DerivedClass zurückgeben. –

+0

Bitte sehen Sie meine Antwort. –

Antwort

1

Verfahren nicht DerivedClass zurückkehren kann, weil es keine Möglichkeit gibt, wenn T zu wissen ist, dass Klasse oder einige andere:

SomeOtherDerived v = (new DrivedClass()).method<SomeOtherDerived>(); 

Es ist nicht klar, was y ou versuchen, vielleicht so etwas wie folgendes Beispiel zu erreichen:

public interface Interface<T> where T : BaseClass 
{ 
    T method(); 
} 

public class DrivedClass: BaseClass,Interface<DerivedClass> 
{ 
    public DerivedClass method() 
    { 
     DerivedClass derviedObj = Builder<DrivedClass>.CreateNew().Build(); 
     return derviedObj ; 
    } 
} 
2

ich mit nbuilder nicht wirklich vertraut bin, aber es sieht aus wie Sie so etwas wie dies versuchen könnten:

public class DrivedClass: BaseClass,Interface 
{ 
    public T method<T>() where T : BaseClass 
    { 
     var derviedObj = Builder<T>.CreateNew().Build(); 

     return derviedObj; 
    } 
} 

Oder diese, wenn das was Sie wirklich nach:

public class DrivedClass: BaseClass,Interface 
{ 
    public T method<T>() where T : BaseClass 
    { 
     var derviedObj = Builder<DrivedClass>.CreateNew().Build(); 

     return derviedObj as T; 
    } 
} 

Dann werden Sie T bekommen, aber es gibt wirklich keine Chance, zu wissen, dass es gelingen wird. Was passiert, wenn Sie eine andere Implementierung hinzufügen, die nicht DrivedClass erbt?

public class MoreDrivedClass : BaseClass, FooInterface 
{ 

} 

Dann wird diese Besetzung nicht:

var drivedClass = new DrivedClass(); 
var foo = drivedClass.method<MoreDrivedClass>(); 

Dann werden Sie nicht in der Lage sein DrivedClass-MoreDrivedClass zu werfen. Foo wird null sein.

+0

Rückgabe derviedObj als T; das hat wie ein Charme funktioniert. – raj

0

Versuchen Sie mit Activator.CreateInstance.

Verwandte Themen