2

属性値に基づいて、アダプターを介してクラスの関数にアクセスしたい。すべての関数は、
私が考えた方法と同じプロトタイプを持っています。それは、次のような辞書を宣言することです。

Dictionary<key_values, Delegate_of_Functions>

ここでkey_values、関数を識別する値を含み、Delegate_of_Functions関数タイプのデリゲートであるクラス。

今、私は次のことをしようとしました:

Functions = new Dictionary<string, function>();

var a = from Fun in typeof(TheFunctionsContainer).GetMethods()
        where Fun.GetCustomAttributes(typeof(The_Attribute), true).Length != 0
        select Fun;

foreach (var c in a)
{
  Functions.Add(
    c.GetCustomAttributes(true).OfType<The_Attribute>().First().key,
    new function(c)); // this line dose not compile
}

私の質問は次のとおりです。

  • コンパイルされない行をコンパイルする方法は?
  • これを行うためのより良い方法はありますか?
4

2 に答える 2

2

functionそれがデリゲートであることを考えると

delegate void function();

メソッドを使用しDelegate.CreateDelegateてデリゲートを作成できます

var Functions = new Dictionary<string, function>();

var a = typeof(TheFunctionsContainer).GetMethods().Where(f => f.GetCustomAttributes(typeof(The_Attribute), true).Any());

foreach (var c in a)
{
    Functions.Add(
      c.GetCustomAttributes(true).OfType<The_Attribute>().First().key,
      (function)Delegate.CreateDelegate(typeof(function), c)); 
}

インスタンスで非静的メソッドを実行する場合は、メソッドが呼び出すインスタンスを提供する必要がありますDelegate.CreateDelegate

(function)Delegate.CreateDelegate(typeof(function), yourInstance, c)

または、svics のコメントを参照してください :-)

于 2012-08-28T12:58:51.663 に答える
-1

これを行う簡単な方法は、見つけたメソッドでInvokeメソッドを呼び出すことです。ディクショナリに追加された匿名デリゲートでそれを行うことができます。

すべての関数が同じプロトタイプ(通常、C# ではシグネチャと呼ばれます) を持っていると言いますが、それがどのようなシグネチャであるかを示していないため、文字列と整数 (で表される) を取る void メソッドを想定します。以下のAction<string, int>私のサンプルコードでは)。あなたに合うようにコードを変更できると信じています:-)

の各要素a、つまりループ内の各要素のタイプはc次のとおりです。foreachMethodInfo

var Function = new Dictionary<string, Action<string, int>>();

// your code for discovering the suitable functions and filling a

foreach (var c in a) {
    Functions.Add(c.GetCustomAttributes(true).OfType<The_Attribute>().First().key,
      (s, i) => {
          c.Invoke(null, new object[] { s, i });
      });
}

ただし、そのディクショナリに何かを追加する前に、メソッドが本当に必要な署名を持っているMethodInfoことをインスタンスが示しているかどうかを確認することをお勧めします。そうしないと、誰かが意図的または意図せずに、その属性を持つ別の署名でメソッドをマークし、呼び出しが失敗する可能性があります。Invoke

于 2012-08-28T12:57:01.203 に答える