私は、ジェネリックメソッドをパラメータとして渡す(this
)という基本クラスのメソッドがある状況で自分自身を見つけました。ジェネリックメソッドでは、派生クラスからメソッドを呼び出すときでも、型は常に基本型です。typeofこれは、派生クラスから呼び出される仮想メソッド
基本型ではなく、派生型であることを知るには汎用メソッドが必要です。
サードパーティのアプリ(http://razorengine.codeplex.com/ - Razor.Parse
メソッド)からのものであるため、汎用メソッドを変更することはできません。
私は、メソッドをジェネリック拡張メソッドとして定義すると、これを呼び出すのが基本クラスから継承する型に限定されているが、この目的のために拡張メソッドを使用するのが面倒だと分かったそれを聞いてうれしいです)。私はそれが呼び出される前に(おそらくジェネリックスを使用して)派生オブジェクトの型に "this"を変換するために使用できるトリックがあるかどうか疑問に思っています。
私は自己完結型でなければならない以下のような単純化されたプログラムを含んでいます(私はLINQPadで簡単に実行しています)。基本的には、B
のインスタンスで呼び出されたときTest.WhatType
と出力 "B"を呼び出すA
で定義されたメソッドが必要です。
これは意味があると思います。
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()
から変更メソッド名。
N.B.このコードを実行すると、次のように出力されます。
A
A
B
あなたの一般的な方法は、種類を気にした場合、過去 'ここで、T:A'その後、その方法を再評価する必要があります。 – cadrell0
まあ、ちょっと間違いありません - 呼び出しコードはクラスAです! (私はそれが役に立たないことを知っています)私は掘り出し物を持って、あなたに戻ってみるよ! –
WhatTypeメソッドではなく、obj.GetType()を使用する必要があります。 –