我发现自己处于这样一种情况,即我在基类上有一个方法,该方法调用了一个将自身作为参数传递的泛型方法(通过this
)。在泛型方法中,类型始终是基类型,即使我从派生类调用该方法也是如此。
我需要泛型方法来知道它是派生类型而不是基类型。
我无法更改通用方法,因为它来自第三方应用程序(http://razorengine.codeplex.com/ -Razor.Parse
方法)。
我发现,如果我将该方法定义为仅限于从我的基类继承的类型的通用扩展方法,那么调用它就可以工作,但是为此目的使用扩展方法似乎很混乱(尽管如果这是正确的用法,我会很高兴听到)。我想知道是否有一些技巧可以在调用之前将“this”转换为派生对象的类型(可能仍然使用泛型)。
我在下面包含了一个应该是自包含的简化程序(为了个人方便,我在 LINQPad 中运行它)。本质上,我想要一个A
在调用实例时定义的方法,B
将调用Test.WhatType
并输出“B”。
我希望这是有道理的。
void Main()
{
var bar = new B();
bar.myGetType();
bar.ExtGetType();
}
class A
{
public virtual void myGetType()
{
Test.WhatType(this);
this.ExtGetType();
}
}
class B : A {}
static class ext
{
public static void ExtGetType<T>(this T obj) where T : A
{
Test.WhatType(obj);
}
}
class Test
{
public static void WhatType<T>(T obj)
{
Console.WriteLine(typeof(T).Name);
}
}
编辑:将方法名称更改为,A.myGetType()
因为我什至没有注意到我意外重载。
注意运行此代码输出:
A
A
B