我的应用程序中有许多"作业",其中每个作业都有一个需要调用的方法列表,以及它的参数。本质上,包含以下对象的列表被称为:
string Name;
List<object> Parameters;
所以基本上,当一个作业运行时,我想枚举这个列表,并调用相关的方法。例如,如果我有如下方法:
TestMethod(string param1, int param2)
我的方法对象是这样的:
Name = TestMethod
Parameters = "astring", 3
有可能做到这一点吗?我想反思将是关键。
当然,你可以这样做:
public class Test
{
public void Hello(string s) { Console.WriteLine("hello " + s); }
}
...
{
Test t = new Test();
typeof(Test).GetMethod("Hello").Invoke(t, new[] { "world" });
// alternative if you don't know the type of the object:
t.GetType().GetMethod("Hello").Invoke(t, new[] { "world" });
}
Invoke()的第二个参数是Object的数组,其中包含要传递给方法的所有参数。
假设这些方法都属于同一个类,那么可以有一个类似于的类的方法
public void InvokeMethod(string methodName, List<object> args)
{
GetType().GetMethod(methodName).Invoke(this, args.ToArray());
}
如果您使用的是.NET Framework 4,请查看dynamic,否则为GetMethod
,然后调用MethodInfo
的Invoke
。
使用MethodBase.Invoke()。应该可以使用System.Reflection
实现.NET 2.0。
如果你不得不求助于反思,那么可能有更好的方法来完成你的任务。这可能需要更多的体系结构,但它是可行的。
请记住,拥有更多的代码并不是一件坏事——尤其是当它赞美代码的可读性和可管理性时。对大多数人来说,反射很难理解,并且您会失去大部分编译时类型的安全性。在您的示例中,您可能只需要使用switch语句和计划调用的每个方法的不同对象就可以了。例如
// Have some object hold the type of method it plans on calling.
enum methodNames
{
Method1,
Method2
}
...
class someObject
{
internal methodNames methodName {get; set;}
internal object[] myParams;
}
...
// Execute your object based on the enumeration value it references.
switch(someObject1.methodName)
{
case Method1:
Test.Method1(Int32.Parse(someObject1.myParams[0].ToString),someObject1.myParams[1].ToString());
break;
...
}
如果你知道你只有一组不同的方法可以调用,为什么不提前做好准备呢?
NuGet去营救!PM> Install-Package dnpextensions
一旦您的项目中有了该包,所有对象现在都应该有一个.InvokeMethod()
扩展,它将把方法名称作为字符串和任意数量的参数。
从技术上讲,这确实对方法名称使用了"魔术字符串",所以如果你想强类型地键入你的方法字典,你可以制作MethodInfo类型的键,并像这样得到它们。。。
MethodInfo[] methodInfos = typeof(MyClass).GetMethods();
然后你可以做这样的事情。。。
var methods = new Dictionary<MethodInfo, Object[]>();
foreach (var item in methods)
item.key.Invoke(null, item.value);
// 'null' may need to be an instance of the object that
// you are calling methods on if these are not static methods.
或者,您可以使用我前面提到的dnpextensions对上面的块进行一些变体。