2011-12-19 11 views
3

これは、クラスに必要な柔軟なロジック構造を作成するために必要なことです。Cで変数の型を再割り当てまたは置換する

クラスは、このようなものです:

public class myclass { 
    public Action myaction; 
    public int actionparams; 
    public string label; 

    public void myactionfunction() { 
    //do void parameter action 
    } 

    public void myactionfunction(int myparam) { 
    //do one parameter action 
    } 

    public void myactionfunction(int myparam, int myparam2) { 
    //do two parameter action 
    } 
} 

は、まあ、私が直面してる問題は、私は「myaction」の任意どれか6つのパラメータと同じくらいを必要としないことができ、このクラスを使用することです。サポートすることを意図している各パラメータに対して 'アクション'を定義する必要があるため、私はパラメータを期待しているほどの「ミクセーション」を定義することができますが、それは理想的ではありません。

私はいくつかの方法で、私は、デリゲートの宣言について読んだことがある

myaction.type = Action<string,int,int>; //i know this looks bad, but should give the idea 

ような何かを行うことができるように、私は「単に」myactionの型を再割り当てすることがあった方法があることを期待しています

することはできませんが、私の目的のためにそれらを使用する方法がある場合は図を示します。

ありがとうございました。

+0

クラス(オブジェクト)のインスタンスは、常にアクションwにバインドされますか同じパラメータでは? –

+0

クラスの異なるインスタンスには、実際に問題のアクションパラメータの数が異なります – roamcel

+0

これは私が求めていたものではありません... –

答えて

1

を使用してみてください。あなたは、しかし、すなわち、すべてがActionなるようにキャプチャを使用することができます。:

public void myactionfunction() { 
    myaction =() => DoSomethingWithoutParameters(); 
} 

public void myactionfunction(int myparam) { 
    myaction =() => DoSomethingWithOneParameter(myparam); 
} 

public void myactionfunction(int myparam, int myparam2) { 
    myaction =() => DoSomethingWithTwoParameters(myparam, myparam2); 
} 

これらが実際にデフォルト値を表している場合は、デフォルト値を使用します!いずれかを介して呼び出すことができます

public void SomeMethod(int x = 123, int y = 456) { 
    myaction =() => Foo(x, y); 
} 

SomeMethod(); 
SomeMethod(1); 
SomeMethod(1, 2); 
SomeMethod(x: 1); 
SomeMethod(y: 2); 
SomeMethod(x: 1, y: 2); 
SomeMethod(y: 2, x: 1); 
+0

これは良い見えます。しかしここで表記を見たことはありません。 "myaction =()"は「キャプチャ」と定義されていますか? – roamcel

+0

@roamcelいいえ、それ( '=>'と一緒に)は* lambda *の始まりです。キャプチャは単純に:ラムダにはローカル変数またはパラメータが含まれています(たとえば、「myparam」は「取得」されています)。ところで、それは意味的に同じです(この場合): 'myAction = delegate {DoSomethingWithOneParameter(myparam); }; ' –

+0

非常に興味深い、ありがとう。私はこれを正しい答えとして受け入れています。なぜなら、あなたは実際に変数型を再割り当てできないことを明確にし、有益な回避策を提示しているからです。 – roamcel

1

いいえ、することはできませんoptionalパラメータ

public void myactionfunction(int myparam, int myparam2 = 0, int myparam3 = 0) { 
... 
} 


void Test() 
{ 
    myactionfunction(5); // Will call myactionfunction(5, 0, 0) 
    myactionfunction(5, 10) // Will call myactionfunction(5, 10, 0) 
    myactionfunction(1, myparam3: 7) // Will call myactionfunction(1, 0, 7) 
} 
+0

悪い習慣、後で彼が7,8、またはそれ以上のパラメータを必要とする場合... –

+1

これは、パラメータのタイプがわかっている場合にのみ有効です。ここではそうではありません。 – AVee

+0

これは私の必要性に理想的ではないにもかかわらず、非常に便利な例でした。ありがとうたくさん – roamcel

2

あなただけ行うことができます。

public void myactionfunction(params object[] prms) 
{ 
    int[] intArray = (int[])prms; 
    //do what ever you need to do... 
} 

これはまた、あなたがアクションごとに異なるのparamsタイプを渡すことができます:

public void myactionfunction(params object[] prms) 
{ 
    if (myAction == ???) 
    { 
     string param1 = (string)prms[0]; 
     //use string as first param 
    } 
    else 
    { 
     int param1 = (int)prms[0]; 
     //use int as first param. 
    } 
    //do what ever you need to do... 
} 

これをlikと呼びますEこの:あなたはジェネリックを使用することができ、アクションを変更に関しては

myactionfunction(); 
myactionfunction(1); 
//and also 
myactionfunction(1,2,3,4,5,6,7,8,9,10); 
+2

'int'パラメータのみを使うときは、 'params int [] prms'を使うのが良いです。 –

+1

オブジェクトを使って、後で適切なキャスティングを行うという、とても良いアイデアです。これは私の問題を理想的に解決するために私を正しい道に導いてくれました。ありがとう。 – roamcel

+0

ええ、それは彼が必要とするものに依存します。 2番目の段落に書いてあるように、この方法で異なるparams型に使うことができます。 –

1

、しかし残念ながら、あなたはとてもそのビットオープン...制約としてActionを定義することはできません。

public class MyClass<TAction> 
{ 
    public TAction Action{get;set;} 
} 

使用方法は、(1列& 2 int型のparamとアクションのため)が考えられます。

var c = new MyClass<Action<string,int,int>>(); 

そして、あなたはそれから

c.Action = (s,i1,i2) => Console.WriteLine("Params were: {0}, {1},{2}",s,i1,i2); 

ライブの例でActionを割り当てることができます。http://rextester.com/DUI63303

関連する問題