2010-01-15 9 views
15

Ho una classe di base, con un metodo, in cui vorrei utilizzare farmaci generici per forzare il codificatore per usare un'espressione generica sulla classe corrente:Come riferimento di tipo classe corrente utilizzando farmaci generici

public class TestClass 
{ 
    public void DoStuffWithFuncRef<T>(Expression<Func<T, object>> expression) where T : TestClass 
     { 
      this.DoStuffWithFuncRef(Property<T>.NameFor(expression)); 
     } 
} 

Ora , Vorrei forzare T ad essere del tipo della classe istanziata, che spero causerà la causa del compilatore C# per capire automaticamente il tipo generico da usare. Per esempio. Vorrei evitare di codifica il metodo doStuff di seguito, dove devo specificare il tipo corretto - ma piuttosto utilizzare il metodo doStuffILikeButCannotGetToWork:

public class SubTestClass : TestClass 
{ 
    public string AProperty { get; set; } 

    public void doStuff() 
    { 
     this.DoStuffWithFuncRef<SubTestClass>(e => e.AProperty); 
    } 

    public void doStuffILikeButCannotGetToWork() 
    { 
     this.DoStuffWithFuncRef(e => e.AProperty); 
    } 
} 

è possibile? Dovrei farlo in un modo diverso?

risposta

19

rendere la classe base stessa generica:

public class TestClass<T> where T : TestClass<T> 
{ 
    public void DoStuffWithFuncRef(Expression<Func<T, object>> expression) 
    { 
     this.DoStuffWithFuncRef(Property<T>.NameFor(expression)); 
    } 
} 

e ne derivano:

public class SubTestClass : TestClass<SubTestClass> { 
    // ... 
} 

Se avete bisogno di avere una gerarchia di ereditarietà con una sola radice, ereditano la classe base generica da un altro versione non generica:

public class TestClass { ... } 
public class TestClass<T> : TestClass where T : TestClass<T> 

Naturalmente dovresti probabilmente creare le classi base astratto.

+0

Grazie. Non pensavo di rendere la classe completa generica nel modo in cui descrivi, ma funziona e causa un piccolo sovraccarico di sintassi. – Thies

Problemi correlati