2

静的クラスのメソッドを呼び出す必要があります。このクラスは実行時にのみ認識されます (これは System.Type 変数です)。私のメソッドがクラス「MyObject」に実装されていることはわかっています。そのようなメソッドを呼び出すにはどうすればよいですか? 私が何をする必要があるかを示すコードは以下のとおりです。少しひねくれたように見えるかもしれませんが、私はこれを良い目的のために使用し、宇宙が内破することを許さないと誓います.

public class MyObject
{
    public static string ReturnUsefulStuff()
    {
        return "Important result.";
    }
}

public class MyChildObject: MyObject
{
    // Hey! I know about ReturnUsefulStuff() method too!
}

public class App
{
    public void Main()
    {
        // The following type isn't supposed to be known at compile time.
        // Except that it will always be MyObject type or its descendent.
        Type TypeOfMyObject = typeof(MyChildObject); 
        // My erotic fantasy below. That line doesn't actually work for static methods
        string Str = (TypeOfMyObject as MyObject).ReturnUsefulStuff();
        // I know that type has this method! Come on, let me use it!

        MessageBox.Show(Str);
    }
}

Delphi では、これは次のように宣言することで実現できます。

// ...
// interface
Type TMyObjectClass = class of TMyObject;
// ...
// implementation
ClassVar := TMyChildObject;
Str := TMyObjectClass(ClassVar).ReturnUsefulStuff();

これは、Delphi の「class of」構造のおかげで機能します。コンパイラは、TMyObject に "ReturnUsefulStuff" があり、TMyChildObject がそこから派生していること、および ClassVar にクラスへの参照があることを認識しています。必要なものはすべて揃っています。C# には「のクラス」という概念がなく、それらすべてを (ほとんど) 支配しない唯一の System.Type しかありません。助言がありますか?あらゆる種類の醜いリフレクション テクニックを使用することを余儀なくされますか?

4

3 に答える 3

1
Type typeOfMyObject = typeof(MyChildObject);
MethodInfo method = typeOfMyObject.GetMethod("ReturnUsefulStuff", BindingFlags.Public | BindingFlags.Static | BindingFlags.FlattenHierarchy);
object result = method.Invoke(null, null);
MessageBox.Show(result.ToString());
于 2012-08-20T15:20:21.757 に答える
1

TypeOfMyObject.GetMethod("ReturnUsefulStuff").Invoke(...)null をターゲット オブジェクト インスタンスとして使用する( http://msdn.microsoft.com/en-us/library/05eey4y9.aspxおよびhttp://msdn.microsoft.com/en-us/library/a89hcwhh.aspxを参照)

于 2012-08-20T15:14:49.937 に答える
1

あなたのコードには誤解があります:

Delphi には「クラス」という概念があります。これは、フィールド/変数がクラス自体の参照を保持できることを意味します。.net clr にはこの概念がありません。実行時の .Net では、特定の型に関する情報を照会できます。呼び出すと、型に関する情報を含むオブジェクトをobj.GetType()取得します。Typeただし、TypeDelphi のようなクラス自体ではなく、一連の情報を含む単なる通常のオブジェクトです。

これが .net では違法である理由です:

// TypeOfMyObject is a object of the class Type, which MyObject does not inherit.
(TypeOfMyObject as MyObject).ReturnUsefulStuff();

したがって、はい、この場合はリフレクションを使用する必要があります。

var method = typeOfMyObject.GetMethod("ReturnUsefulStuff", 
      BindingFlags.Public | BindingFlags.Static | BindingFlags.FlattenHierarchy);
var result = method.Invoke(null, null);
于 2012-08-20T15:35:07.793 に答える