如何将一个通用类型转换为适应另一个通用方法

7

我有一个在A类中的方法

public IList<T> MyMethod<T>() where T:AObject

我希望在另一个通用类B中调用此方法。这个T没有任何限制。

public mehtodInClassB(){
    if (typeof(AObject)==typeof(T))
    {
      //Compile error here, how can I cast the T to a AObject Type
      //Get the MyMethod data
        A a = new A();
        a.MyMethod<T>();
    }
}

类C继承自类AObject。

B<C> b = new B<C>();
b.mehtodInClassB() 

有什么想法吗?

在你的提醒下更新:

是的,我实际想做的是

typeof(AObject).IsAssignableFrom(typeof(T))

不是

typeof(AObject)==typeof(T))

如果我们能够看到其他类的更多操作,我们可能能够提供更相关的建议。 - Kendall Frey
d的类型是什么?如果它是正确的类型,你不需要传递类型参数(例如 d.MyMethod()),直接调用MyMethod方法即可。 - Chris
1
@Chris 这个方法是通用的,不需要参数。在这种情况下,您不能省略通用类型参数,因为没有办法从使用中推断它。 - Chris Hannon
@ChrisHannon:啊,是的,我的错。 :) 忘记了它不能使用返回类型来确定任何内容。 :) - Chris
2个回答

7

如果您知道T是一个AObject,为什么不直接将AObject作为类型参数提供给MyMethod

if (typeof(AObject).IsAssignableFrom(typeof(T)))
{
  //Compile error here, how can I cast the T to a AObject Type
  //Get the MyMethod data
    d.MyMethod<AObject>();
}

如果不能将 AObject 作为类型参数提供,则必须在调用方法中对 T 添加相同的约束:
void Caller<T>() where T: AObject
{
    // ...

    d.MyMethod<T>();

    // ...
}

1
因为AObject在这里是基类。 - ValidfroM
2
你知道吗,如果 TAObject,那么 typeof(T) 只会等于 typeof(AObject)。我想你的意思是 typeof(AObject).IsAssignableFrom(typeof(T)) - Kendall Frey

1

除非您对包含方法施加相同的约束,否则无法这样做。泛型在编译时进行检查,因此您无法做出运行时决策。

或者,您可以使用反射来调用该方法,只需要编写更多的代码。

有关如何执行此操作的更多信息,请参见此 SO 问题:如何使用反射调用泛型方法?


只要告诉编译器决策是什么,你就可以在运行时做出决策。如果你明确地将其转换为AObject,则编译器将知道它是一个AObject,并可以适当地工作。 - Chris
@Chris 你好,如何在泛型参数上执行强制类型转换? - CodingGorilla
@Chris 这里的问题是 AObject 是一个基类。T 可以是 AObject 的派生类,但不知道如何转换它。 - ValidfroM
@ValidfroM 你无法转换泛型参数,因此如果Dan的答案对你不起作用,那么你将不得不使用反射。 - CodingGorilla

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接