1

「トリガー」と呼んでいるものをコーディングしようとしています。これらは、オブジェクト、関数、および何らかのアクティブ化基準を取ります。アクティブ化されると、そのオブジェクトでメソッドが実行されます。

これは基本的な簡素化された例です。今のところ期待どおりに動作します。使用例は次のとおりです。

SomeObject myObj = new SomeObject();
MyTrigger trigger = new MyTrigger(myObj, "Delete");
trigger.Activate(); // calls myObj.Delete();

今私が呼び出しInvokenull場所は、パラメータが通常行くことができる場所です(私は思います)。私が抱えている問題は、関数宣言の単一のパラメーターとして「ゼロ以上のパラメーター」を取得することです。作成時に 3 番目のパラメーターが必要です。MyTriggerこれは、Invoke.

またはそれを行うためのさらに良い方法はありますか?つまり、どうにかしてオブジェクト、関数呼び出し、およびパラメーターを単一のパラメーターとして渡すことはできますか? 多分2つのパラメータ?

4

2 に答える 2

4

デリゲートを使用する必要があります。

// rewrite your trigger constructor like this
class MyTrigger<TTarget>
{
    public MyTrigger(TTarget target, Action<TTarget> action);
    public void Activate()
    {
        this._action(this._target);
    }
}

// now call it with or without parameters
SomeObject myObj = new SomeObject();
var trigger = new MyTrigger<SomeObject>(myObj, o => o.Delete(1234));
trigger.Activate();

静的ヘルパー クラスを作成して、作成コードを少し簡単に書くこともできます。

static class MyTrigger
{
    public MyTrigger<TTarget> Create<TTarget>(TTarget target, Action<TTarget> action)
    {
        return new MyTrigger<TTarget>(target, action);
    }
}

// now write the initialization code like this (you don't have to specify the type parameter anymore):
var trigger = MyTrigger.Create(myObj, o => o.Delete());
于 2013-05-14T14:41:35.353 に答える
2

paramsキーワードを使用できます。

public Trigger(object targetObject, string methodName, params object[] parameters)
{
    //"parameters" here will be an array of length 0 if no parameters were passed    
}

MyTrigger trigger = new MyTrigger(myObj, "Delete"); //no parameters
MyTrigger trigger = new MyTrigger(myObj, "Delete", param1); //one parameter
MyTrigger trigger = new MyTrigger(myObj, "Delete", param1, param2); //two parameters

しかし、コンパイル時の安全性も提供するため、Knagisの回答Triggerを好みます(おそらく、クラスははるかに単純化され、おそらくそこにあるリフレクションはすべて捨てられます)。

于 2013-05-14T14:43:18.983 に答える