自分自身をパラメーターとして渡すジェネリックメソッドを呼び出すメソッドが基本クラスにある状況に陥っています( 経由this
)。ジェネリック メソッドでは、派生クラスからメソッドを呼び出す場合でも、型は常に基本型です。
基本型ではなく派生型であることを知るには、ジェネリック メソッドが必要です。
サードパーティのアプリ (http://razorengine.codeplex.com/ -Razor.Parse
メソッド) からのものであるため、ジェネリック メソッドを変更できません。
メソッドを、基本クラスから継承する型に制限された汎用拡張メソッドとして定義すると、これを呼び出すと機能することがわかりましたが、この目的で拡張メソッドを使用するのは面倒なようです (ただし、これが正しい使用法であれば、私は満足しています)。それを聞くために)。呼び出される前に「これ」を派生オブジェクトの型に変換するために使用できるトリックがあるかどうか疑問に思っています(おそらくまだジェネリックを使用しています)。
以下に、自己完結型の単純化されたプログラムを含めました (個人的に簡単にするために LINQPad で実行しています)。基本的にA
、のインスタンスで呼び出されたときに定義されたメソッドが必要であり、「B」B
を呼び出して出力します。Test.WhatType
これが理にかなっていることを願っています。
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