Я оказался в ситуации, когда у меня есть метод в базовом классе, который вызывает вызов общего метода, передающего себя как параметр (через this
). В универсальном методе тип всегда является базовым типом, даже когда я вызываю метод из производного класса.typeof это в виртуальных методах, вызванных из производного класса
Мне нужен общий метод, чтобы знать, что он имеет производный тип, а не базовый тип.
Я не могу изменить общий метод, так как это от стороннего приложения (http://razorengine.codeplex.com/ - Razor.Parse
).
Я обнаружил, что если я определяю метод как общий метод расширения, ограниченный типами, наследуемыми от моего базового класса, который вызывает это, то работает, но кажется бесполезным использовать методы расширения для этой цели (хотя, если это верно использование I будем рады услышать это). Я задаюсь вопросом, есть ли какой-нибудь трюк, который я могу использовать, который преобразует «это» в тип производного объекта до его вызова (возможно, с использованием дженериков все еще).
Я включил упрощенную программу ниже, которая должна быть автономной (я запускаю ее в 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);
}
}
Edit: Измененное имя метода A.myGetType()
, так как я даже не заметил, что я перегружать случайно.
N.B. Выполнение этих выходов кода:
A
A
B
Если шаблонный метод заботится о типе, мимо ', где T: A', то вы необходимо переоценить этот метод. – cadrell0
Ну, это правда - вызывающий код IS class A! (Я знаю, что это не полезно) У меня будет копать и попробуйте вернуться к вам! –
Вам нужно будет использовать obj.GetType() вместо метода WhatType. –