2012-08-24 68 views
7

我有一种在如何投泛型类型,以适应另一个泛型方法

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类继承自Class AObject。

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

有什么想法?

后URS提醒...更新:

是。我真正想要做的是

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

typeof(AObject)==typeof(T)) 
+0

如果我们能看到更多的其他类做什么,我们也许能够提供更多的相关咨询。 –

+0

'd'的类型是什么?如果它是正确的类型,你可以不直接调用MyMethod而不需要传入类型参数(例如'd.MyMethod()')? – Chris

+1

@Chris该方法是通用的,不需要参数。在这种情况下,您不能省略泛型类型参数,因为无法从使用中推断泛型类型参数。 –

回答

7

如果你知道TAObject,为什么不直接提供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

你知道什么,虽然,'的typeof(T)'只会等于'typeof运算(AObject)''如果是T''AObject'。我觉得你的意思'typeof运算(AObject).IsAssignableFrom(typeof运算(T))' –

+0

@Kendall弗雷同意。 – Dan

1

你不能这样做,除非你把相同的约束上含有方法。泛型在编译时被检查,所以你不能做出这样的运行时决定。

或者,你可以使用反射来调用方法,它只是需要更多一点的代码。

参见这太问题上如何做到这一点的详细信息:How do I use reflection to call a generic method?

+0

只要告诉编译器做出什么决定,你就可以做出运行时决定。如果您明确投射到AObject,那么编译器将知道它的一个AObject并可以正常工作。 – Chris

+0

@Chris你如何做一个泛型参数的铸造? – CodingGorilla

+0

@Chris这里的问题是AObject是一个基类。 T可以是AObject的派生类,不知道如何投射它。 – ValidfroM

相关问题