重新赋值或替换c#中的变量类型

本文关键字:变量 类型 替换 新赋值 赋值 | 更新日期: 2023-09-27 18:18:10

这是我需要做的事情,以创建一个灵活的逻辑结构,我需要一个类。

类是这样的:

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的类型,这样在某种程度上我可以做一些事情,如

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

我读过委托声明,但不知道是否有一种方法可以使用它们来达到我的目的。

谢谢。

重新赋值或替换c#中的变量类型

你可以这样做:

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);

不行。但是,您可以使用捕获,使所有内容都是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);

尝试使用可选参数

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

关于改变动作,您可以使用泛型,但不幸的是,您不能将Action定义为约束…所以它有点开放。

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

用法可以是(for Action with 1 string &2 int参数):

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