7

C# を介して CLR にステートメントがあり、C# では、GetType は仮想であり、オーバーライドできないため、あるクラスを別のクラスに偽装することはできません。

しかし、C# では GetType の親実装を非表示にできると思います。

私は何かを逃したに違いない

ベースの GetType 実装を非表示にすると、自分のクラスを別のクラスに偽装できますが、それは正しいですか?

ここで重要なのは、GetType が仮想かどうかではなく、C# であるクラスを別のクラスに偽装できるかどうかです。

以下は、可能な重複からのNO.4の回答です。私の質問はこれに関するものです。この種の偽装は可能ですか?もしそうなら、C#でクラス型の偽装を防ぐことができるとどのように言えますか? GetType が仮想かどうかに関係なく

object.GetType() メソッドをオーバーライドできないことは事実ですが、「new」を使用して完全にオーバーロードし、別の既知の型になりすますことができます。これは興味深いことですが、「Type」オブジェクトのインスタンスをゼロから作成する方法がわかりません。そのため、以下の例は別の型のふりをしています。

public class NotAString {
    private string m_RealString = string.Empty;
    public new Type GetType()
    {
        return m_RealString.GetType();
    } } 

この (new NotAString()).GetType() のインスタンスを作成すると、実際に文字列の型が返されます。

share|edit|flag は 3 月 15 日 18:39 に回答しました

Dr Snooze 213 GetType を参照するほとんどすべてのオブジェクトは、オブジェクトのインスタンスを持っているか、少なくともそれらが制御または推論できるいくつかの基本型を持っています。最も派生した型のインスタンスが既にある場合は、GetType を呼び出す必要はありません。ポイントは、誰かがオブジェクトで GetType を使用している限り、それが他のカスタム定義ではなく、システムの実装であることを確信できるということです。– Servy 3 月 15 日 18:54 にコメントを追加

4

3 に答える 3

6

この質問は、コンテキストを定義する場合にのみ意味があります:
誰から/何から変装しますか?

いくつかのオプションがあります:

  1. ランタイムが別の型として解釈するように偽装する:このメソッドを使用する
    ことはできません。ランタイムは呼び出しさえしませんGetType

  2. 他のライブラリが別の型として解釈するように偽装する:この方法を使用する
    ことはできません。ライブラリがBあなたのクラスを渡すことができない場合、ライブラリが取るX場合、それはあなたのクラスをobjectそのまま呼び出しません。GetTypenewoverride

  3. 開発者がデバッグ時に他のタイプであると思わせるように偽装する:可能です (開発者があなたのトリックに気付かない場合)。しかし、なぜですか?

于 2013-06-26T04:03:11.283 に答える
4

GetType仮想ではありません。それ以外の場合はオーバーライドされるはずです。それはexternです。

new基本クラスの実装を非表示にする場合は、修飾子を使用できます。

オブジェクト インスタンスの型を知るには、さまざまな方法があります。次の例は、この偽装がいかに簡単に暴かれるかを示しています。

public static class TestClass {
    public static void TestMethod() {
        var x=new Pretended();
        Console.WriteLine("{0}", x.GetType());
        Console.WriteLine("{0}", (x as object).GetType());
    }
}

public partial class Pretended {
    public new Type GetType() {
        return typeof(int);
    }
}

の出力TestMethod:

System.Int32

ふりをした

C# では、ほとんどの(すべてではないことに注意してください) 型は から派生しますobject。つまり、それらの最終的な基本クラスはobjectです。GetTypeはオーバーライドできないため、base.GetType()は常に存在します。の偽の実装を呼び出さずに型を知るアプローチGetType()は、実際の型を公開するだけです。

于 2013-06-26T03:35:00.793 に答える
2

GetTypeメソッドは としてマークされていvirtualないため、オーバーライドできません。キーワードを使用して の実装を非表示にすることGetTypeは可能ですが、型は正しく返され、開発者が操作することはできません。newbase.GetType()

于 2013-06-26T03:51:22.873 に答える