【发布时间】:2012-05-02 12:50:42
【问题描述】:
我发现自己的情况是,我在基类上有一个方法,该方法调用一个泛型方法,将自身作为参数传递(通过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
【问题讨论】:
-
如果你的泛型方法关心类型,过去
where T : A,那么你需要重新评估那个方法。 -
嗯,有点对 - 调用代码是 A 类! (我知道这没有帮助)我会挖掘并尝试回复你!
-
您将不得不在 WhatType 方法中使用 obj.GetType()。
-
此外,GetType 是一种未标记为虚拟对象的方法。请不要尝试覆盖它。
标签: c# .net generics virtual-functions