代码之家  ›  专栏  ›  技术社区  ›  Thies

如何使用泛型引用当前类类型

  •  16
  • Thies  · 技术社区  · 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方法进行编码,在这里我必须指定正确的类型,而应该使用dostuffilicebuchannotgettowork方法:

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

    这有可能吗?我应该用另一种方式来做吗?

    1 回复  |  直到 10 年前
        1
  •  19
  •   Mehrdad Afshari    15 年前

    使基类本身成为泛型:

    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>
    

    当然,您应该将基类抽象化。