泛型方法从超类获取参数类型

Jan*_*n S 5 c# generics inheritance this

我在C#中的类型化方法有问题。我想调用对象的继承方法。该方法调用以“ this”为参数的静态方法。静态方法的参数是通用的。现在,我希望此参数的通用类型是第一个对象的类型。但是参数始终具有抽象类的类型。

这是示例:

abstract class AbstractClass
{
    bool update()
    {
        Connection.Update(this);
    }
}

class Entity : AbstractClass
{
}

class Connection
{
    public static void Update<T>(T obj)
    {
        someMethod<T>()
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我尝试这样做:

Entity foo = new Entity();
foo.update();
Run Code Online (Sandbox Code Playgroud)

Connection.Update将在调试器中如下所示:

public static void Update<AbstractClass>(AbstractClass obj)
{
    someMethod<AbstractClass>()
}
Run Code Online (Sandbox Code Playgroud)

但是我想要这个:

public static void Update<Entity>(Entity obj)
{
    someMethod<Entity>()
}
Run Code Online (Sandbox Code Playgroud)

有没有可能

someMethod<typeof(obj)>()
Run Code Online (Sandbox Code Playgroud)

还是要解决我的问题?

Moj*_*aba 1

编译器尝试推断 T 参数的类型,在基类中它没有信息来推断实体类型。因此,当您想要调用 Update 函数时,您应该提供子类型的信息。@Alexandr 的答案是一个很好的答案,只是一种改进,向 T 类型参数添加类型约束以将其限制为 AbstractClass 的子级

abstract class AbstractClass<T>
where T: AbstractClass<T> //restrict T as a child of AbstractClass<T>
{
    bool update()
    {
        Connection.Update<T>(this as T);
    }
}

class Entity : AbstractClass<Entity>
{
}

class Connection
{
    public static void Update<T>(T obj)
    {
        someMethod<T>()
    }
}
Run Code Online (Sandbox Code Playgroud)