如何使用当前类型的泛型

时间:2012-07-10 20:55:14

标签: c# .net generics

我有这个基类:

public abstract class Parent {
    public void DoSomething() {
        var c=new GenericClass<**ThisInstanceType**>();
        c.DoYourThing();
    }
}

我应该将 ThisInstanceType 替换为使用类型为“this”(当前子实例)的泛型?

我无法更改Parent.DoSomething()的声明。它不能是void DoSomething<T>()

3 个答案:

答案 0 :(得分:1)

如果你使抽象类具有通用性,你可以像这样实现它:

public abstract class Parent<T> where T : Parent<T> {
    public void DoSomething() {
        var c = new GenericClass<T>();
        c.DoYourThing();
    }
 }

public class Child : Parent<Child> {}

答案 1 :(得分:0)

你可以这样做:

public abstract class Parent<T> : IParent
{
    public void DoSomething() {
        var c=new GenericClass<T>();
        c.DoYourThing();
    }
}

public sealed class Child : Parent<Child>
{
}

如有必要,您可以添加:

公共接口IParent {     void DoSomething(); }

顺便说一句:如果你包括完整的现实生活中的例子,我可能会给你一个更好的解决方案

另一个解决方案是使用反射来获取正确的类型并在运行时调用该方法...

答案 2 :(得分:0)

如果你真的无法正确设计它,你可以通过反射来做到这一点。我毫不犹豫地建议,因为你真的应该重新设计你的界面,但是:

Type t = typeof(GenericClass<>).MakeGenericType(this.GetType());
object c = Activator.CreateInstance(t);
c.InvokeMember("DoYourThing", BindingFlags.Public | BindingFlags.Instance | BindingFlags.InvokeMethod, null, c, new object[] {});