2010-01-15 8 views
15

ich eine Basisklasse haben, mit einem Verfahren, in dem ich Generika verwenden möchte den Codierer zu zwingen, einen generischen Ausdruck auf der aktuellen Klasse zu verwenden:Wie aktuelle Klasse Typ referenzieren die Verwendung von Generika

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

Jetzt Ich möchte T zwingen, vom Typ der instanziierten Klasse zu sein, was, wie ich hoffe, dazu führen wird, dass der C# -Compiler den zu verwendenden generischen Typ automatisch versteht. Z.B. Ich möchte unter Codierung der doStuff Verfahren vermeiden, wo ich den richtigen Typ angeben müssen - sondern die doStuffILikeButCannotGetToWork Methode verwenden:

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); 
    } 
} 

ist das möglich? Soll ich das anders machen?

Antwort

19

Machen Sie die Basisklasse selbst generic:

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

und leiten daraus:

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

Wenn Sie eine Vererbungshierarchie mit einer einzigen Wurzel haben müssen, die generische Basisklasse von einer anderen erben nicht-generische Version:

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

Natürlich sollten Sie wahrscheinlich die Basisklassen machen abstrakt.

+0

Vielen Dank. Ich habe nicht daran gedacht, die komplette Klasse generisch so zu gestalten, wie Sie es beschreiben, aber es funktioniert und verursacht wenig Syntax-Overhead. – Thies

Verwandte Themen