重新赋值或替换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
我读过委托声明,但不知道是否有一种方法可以使用它们来达到我的目的。
谢谢。
你可以这样做:
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