2010-01-15 37 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