2010-01-15 55 views
15

我有一個基類來引用當前類型,帶的方法,其中,我想使用泛型迫使編碼器對當前類使用一個通用表達式:如何使用泛型

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

現在,我想強制T是實例化類的類型,我希望C#編譯器能夠自動理解要使用的泛型類型。例如。我想避免編碼下面的doStuff方法,在這裏我必須指定正確的類型 - 而要用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); 
    } 
} 

這可能嗎?我應該以不同的方式來做這件事嗎?

回答

19

使基類本身一般:

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

,並能從中得到:

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

如果你需要有一個根的繼承層次結構,從另一個繼承了通用基礎類非通用版本:

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

當然,您應該使基類抽象。

+0

謝謝你。我沒有想到按照你所描述的方式製作完整的類,但它起作用並且導致很少的語法開銷。 – Thies