有个想法 如何实现呢

快乐乔巴 2012-03-19 10:46:20
假如说有这样一个类
    public class MyClass
{
public static int Method1(int p1)
{
return p1;
}
public static string Method2(string p1,string p2)
{
return p1 + p2;
}
public static List<int> Method3(int p1, int p2)
{
List<int> list = new List<int>();
list.Add(p1);
list.Add(p2);
return list;
}
}


然后想实现这样的一个操作,把方法添加进一个数据,但不执行,添加完毕后然后再循环出来挨个执行
//添加定义的方法,但不执行
array.Add(MyClass.Method1(1));
array.Add(MyClass.Method2("2","3"));
array.Add(MyClass.Method3(4, 5));
//循环出来挨个执行
foreach (var item in array)
{
item();
}


这应该如何去实现呢,别告诉我用if一个一个判断。。。 就像委托一样的添加最后一并执行,但是委托貌似和我想实现的有点不同的,可以看出我执行的方法中不仅返回类型不同,参数也不同。而且执行的时候是参数值是不一样的,委托的话是执行的时候传入一个参数,各个方法执行时的参数值都一样的。

这个怎么弄呢?
...全文
179 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
SeeWorld 2012-03-19
  • 打赏
  • 举报
回复
定义委托:
public delegate TResult MethodDelegateHandle<TResult, TParams>(params TParams[] args);

MyClass myClass = new MyClass();

Dictionary<Delegate, object> methods
= new Dictionary<Delegate, object>();

methods.Add(new MethodDelegateHandle<int, int>(myClass.Method1), (new int[]{1}));
methods.Add(new MethodDelegateHandle<string, string>(myClass.Method2), new string[] { "a", "b" });

foreach (var item in methods)
{
object obj = item.Key.DynamicInvoke(item.Value);
Console.WriteLine(obj);
}

另外要把方法改一改
public int Method1(params int[] a)
{
Console.WriteLine("Method1 : ");
return a[0];
}

public string Method2(params string[] s)
{
Console.WriteLine("Method2 : ");
return s[0] + s[1];
}

hwbox 2012-03-19
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 chopper7278 的回复:]
引用 7 楼 hwbox 的回复:

你这就是一个参数表加方法名的列表。
用反射不就正好么。

那也要指定啊 我又不是全追加。。
[/Quote]

不懂你的意思。不过你不用反射的话。可以用线程啊,把他们都搞成线程实例,不执行。等要用的时候,依次start就得了。
快乐乔巴 2012-03-19
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 hwbox 的回复:]

你这就是一个参数表加方法名的列表。
用反射不就正好么。
[/Quote]
那也要指定啊 我又不是全追加。。
快乐乔巴 2012-03-19
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 chopper7278 的回复:]

一楼的不错
[/Quote]
看错了 是2楼。。。
hwbox 2012-03-19
  • 打赏
  • 举报
回复
你这就是一个参数表加方法名的列表。
用反射不就正好么。
肖无疾 2012-03-19
  • 打赏
  • 举报
回复
学习2楼
快乐乔巴 2012-03-19
  • 打赏
  • 举报
回复
一楼的不错
  • 打赏
  • 举报
回复
泛型也是具体情况下具体处理.如果不判断或者强制转换,你怎知道你要处理的集合究竟是何种类型,又怎能统一的去处理这批数据呢?
SeeWorld 2012-03-19
  • 打赏
  • 举报
回复
考虑使用Dictionary<TMethod, TParams[]>,其中TMethod可以定义成TResult delegate(T params[])形式的委托,大概思路如此,具体类型可以再考虑
effun 2012-03-19
  • 打赏
  • 举报
回复


List<Action> array = new List<Action>();
//添加定义的方法,但不执行
array.Add(() => MyClass.Method1(1));
array.Add(() => MyClass.Method2("2","3"));
array.Add(() => MyClass.Method3(4, 5));
//循环出来挨个执行
foreach (var item in array)
{
item();
}
快乐乔巴 2012-03-19
  • 打赏
  • 举报
回复
忘记说了 第二段代码是想像的 如何实现那样的效果呢
effun 2012-03-19
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 chopper7278 的回复:]

Action好像取不到返回值吧
[/Quote]

那可以改用Func。因为返回值类型不确定,只能用object了。

List<Func<object>> array;

wanghui0380 2012-03-19
  • 打赏
  • 举报
回复
如果是这样的要求,到时可以参考Dynamic linq,irony或者mathPasre一类的开源项目

这几个东西在codeplex可以找的到
wanghui0380 2012-03-19
  • 打赏
  • 举报
回复
嗯,上面的方法其实都不错,只是都是场合性的,也就是完成lz现有的要求没啥问题

但是lz的要求一旦继续深入下去,应该算是一个小型的语法解释引擎了

比如 "1+2*method1(参数1,参数2)-Method2(参数3)"
快乐乔巴 2012-03-19
  • 打赏
  • 举报
回复
Action好像取不到返回值吧

110,499

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧