2

自分自身をパラメーターとして渡すジェネリックメソッドを呼び出すメソッドが基本クラスにある状況に陥っています( 経由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
4

3 に答える 3

3

を使用する必要がありますobj.GetType()Tは実行時ではなくコンパイル時にバインドされるためtypeof(T)、コンパイル時の型の を返しますT

于 2012-05-02T12:59:50.437 に答える
2

私が正しく理解している場合、あなたの問題は、それが知っているすべてであるため、A.GetType()バインドされていることです。WhatType<A>

したがってA、派生クラスについてクラスに知らせる必要があります。

これは、自己参照ジェネリック型で行うことができます。何かのようなもの:

class A<T> where T : A<T>
{
    public virtual void GetType()
    {
        Test.WhatType<T>( (T) this );
    }
}

class B : A<B> { }

それから:

new B().GetType();

にバインドされWhatType<B>、出力されますB

于 2012-05-02T13:12:02.493 に答える
-1

このメソッドは、静的型 (T) の型を返します。として実装する必要があります

public static void WhatType<T>(T obj) 
{ 
    Console.WriteLine(obj.GetType().Name); 
} 

編集: ジェネリック メソッドの T が変更されるように A を操作することが必要であることに気付きました。これは、リフレクションを介して行うか、A のサブタイプに基づいて switch ステートメントを追加し、これを B (または任意のクラス) に明示的にキャストすることによって行うことができます。もちろん、A はそのサブクラスに依存し、リフレクションは単純に sux であるため、このソリューションはどれも適切ではありません。もう 1 つのオプションは、各サブクラスで GetType() メソッドをオーバーライドして、責任をサブクラスに移すことです。

于 2012-05-02T12:57:37.013 に答える