是否可以在没有显式转换的情况下在运行时获取较低的继承类?
假设我们有三个课程A
,B
和C
。
class A {
int _a;
}
class B : A {
int _b;
}
class C : A {
int _c;
}
我在代码中的某处有一个通用方法。
void Foo<T> (T t) where T : A;
在这种情况下,我有一个对象A
的引用列表,但我必须调用Foo
并传递给Foo
实例的较低对象类型。在其他方法中,此列表包含A
的某些实例和B
的其他实例的C
引用。
我希望能够在没有显式转换的情况下使用较低级别的实例调用Foo
。在我的实际情况中,我有大量的B
和C
继承自A
,我有一些方法可以做这项工作(我的意思是,这个&#34 ;隐含&#34;垂头丧气)。我必须在下面做这样的事情。
在某些地方:
A tmp = new C();
在其他地方:
Foo<typeof(tmp).SomeMagicMethod()>(tmp);
Type.SomeMagicMethod
应该是我可以用来隐式获得&#34; tmp&#34;的较低级别的任何内容。
答案 0 :(得分:1)
快速回答否,您无法为C#中的泛型提供非显式type
。这是通过设计完成的,因为您必须提供有关您在方法中提供的变量类型的完整信息。
另一方面,您可以删除方法的generic
部分,并在没有类型参数的情况下调用它。由于您已经提供了tmp
的类型,编译器将使用该信息进行泛型类型选择:
Foo(tmp);