1

デリゲートとメソッドがある場合

public delegate void SomeDelegate(String p);

void aMethod(String p) {
}

そして、私はこれを新しいスレッドで呼び出そうとします

SomeDelegate sd = new SomeDelegate(aMethod());
sd.BeginInvoke("heyhey", callBack, null)

BeginInvoke メソッド呼び出しは、最初のパラメーターとして文字列を受け入れるようになりましたが、デリゲートと aMethod() から "String p" を削除すると、BeginInvoke に必要なパラメーターは 2 つだけになりました。

他の場所のコードに基づいて、さまざまなタイプのパラメーターを動的に受け入れる BeginInvoke のような関数を作成するにはどうすればよいですか?

あいまいで申し訳ありませんが、これまでに見たことがなく、非常に興味があります。

4

5 に答える 5

4

あなたが見逃しているのは、//メソッドが定義されていないという事実だと思います-Invokeそれらはコンパイラによってデリゲートタイプに対して自動的に生成されます。BeginInvokeEndInvokeDelegate

最初に宣言したとき

public delegate void SomeDelegate(String p);

コンパイラは以下を生成します:

public class SomeDelegate : Delegate
{
    public SomeDelegate(Object target, IntPtr method) { ... }

    public virtual IAsyncResult BeginInvoke(string p, 
        AsyncCallback callback, object @object) { ... }

    public virtual void EndInvoke(IAsyncResult result) { ... }

    public virtual void Invoke(string p) { ... }
}

(適切なメソッド本体、属性などを使用)。

SomeDelegateの署名を変更してパラメーターを削除すると、生成されるタイプは次のように変更されます。

public class SomeDelegate : Delegate
{
    public SomeDelegate(Object target, IntPtr method) { ... }

    public virtual IAsyncResult BeginInvoke(
        AsyncCallback callback, object @object) { ... }

    public virtual void EndInvoke(IAsyncResult result) { ... }

    public virtual void Invoke() { ... }
}

本当に動的なことは何も起こっていません-あなたはの署名を変更しましたSomeDelegate、そしてそれはの署名を変更しますSomeDelegate.BeginInvoke。不思議なことは何もありません。

于 2009-03-27T06:35:48.690 に答える
2

私は、インテリセンスがデリゲートの仕事をしていると信じています。

おそらくparamsキーワードを使用してメソッドを定義し、メソッドが可変量のパラメーターを受け入れるようにすることもできますが、C# 4.0 がリリースされるまで (オプションの名前付きパラメーターがあります)、そのようなことを自分でできるかどうかはわかりません。

もちろん、私は間違っているかもしれません。

于 2009-03-27T05:30:03.280 に答える
0

これはあなたができることではありません。あなたはコンパイラほど強力ではありません!

于 2009-04-29T16:27:04.517 に答える
0

これは、メソッドのオーバーロードと呼ばれます。ここでチュートリアルを見つけることができます。

編集:

それから私はおそらくあなたの質問を誤解しました。

オーバーロードせずにさまざまなパラメーターを受け入れる方法を探している場合は、次を使用します。

public void MyMethod(params object[] args)
{
  foreach (object o in args)
  {
    Type t=o.GetType();
    // do something with o depending on the type
    if (t==typeof(int))
    {
      int i=(int)o; 
      // ...
    }
    else if (t==typeof(string)) // etc.
    {
    }
  }
}

その後、次のように呼び出すことができます。

MyMethod(5, "foo", 7.77);
MyMethod("foo", "bar");
// etc.
于 2009-03-27T05:20:33.643 に答える
0

あなたが何をしたいのかははっきりしていません。異なるパラメーターで新しいデリゲートを作成する方法を知りたい場合は、次のようにします。

public delegate void SomeDelegate(String p, string q);
private static void aMethod(string p, string q) 
{
    Console.WriteLine(p + q);
}

デリゲートを使用するには:

SomeDelegate sd = new SomeDelegate(aMethod);
sd.BeginInvoke("heyhey", "yoyo" callback, null);

一方、以前に定義されたデリゲートなしでメソッドを呼び出して新しいスレッドを開始する場合は、次を使用できます。

ThreadPool.QueueUserWorkItem(delegate { aMethod("heyhey", "yoyo"); });
于 2009-03-27T05:42:05.997 に答える