Переназначить или заменить тип переменной в C # - PullRequest
4 голосов
/ 19 декабря 2011

Это то, что мне нужно сделать, чтобы создать гибкую логическую структуру, которая мне нужна для класса.

Класс такой:

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» может произвольно не требовать ни одного, или целых шести параметров. Поскольку «Action» необходимо определить для каждого параметра, который он должен поддерживать, я, безусловно, мог бы определить столько «myactions», для которых я ожидаю параметры, но это не было бы идеально, так как мне нужно было бы там жестко связывать типы параметров.

Я надеюсь, что есть способ, которым я мог бы "просто" переназначить тип моей операции, чтобы каким-то образом я мог сделать что-то вроде

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

Я читал об объявлениях делегатов, но не могу понять, есть ли способ использовать их для моих целей.

Спасибо.

Ответы [ 4 ]

2 голосов
/ 19 декабря 2011

вы можете просто сделать:

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

это также позволит вам передавать различные типы параметров для каждого действия:

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...
}

Это можно назвать так:

myactionfunction();
myactionfunction(1);
//and also
myactionfunction(1,2,3,4,5,6,7,8,9,10);
1 голос
/ 19 декабря 2011

Что касается изменения действия, вы можете использовать Generics, однако, к сожалению, вы не можете определить Action как ограничение ... поэтому оно немного открыто.

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

Тогда может быть использовано (для Action с 1 строкой и 2 int param):

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

И затем вы можете назначить Action с помощью

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

Живой пример: http://rextester.com/DUI63303

1 голос
/ 19 декабря 2011

Нет, вы не можете.Однако вы можете использовать захват так, чтобы все было 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);
1 голос
/ 19 декабря 2011

Попробуйте использовать необязательные параметры

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)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...