我正在尝试构建一个字典,为类中的每个静态方法编制索引,以便可以使用字符串查找它们。我似乎无法找到一种方法来实际从MethodInfo获取对该方法的引用。这可能吗?
delegate void SkillEffect(BattleActor actor, BattleActor target);
public static class SkillEffectLookup
{
public static Dictionary<string, SkillEffect> lookup;
public static void Build()
{
lookup = new Dictionary<string, SkillEffect>();
Type type = typeof(SkillEffects);
var methods = type.GetMethods(BindingFlags.Static | BindingFlags.Public);
foreach (MethodInfo methodInfo in methods)
{
lookup.Add(methodInfo.Name, _____________);
}
}
public static class SkillEffects
{
public static Attack(BattleActor actor, BattleActor target)
{
// Do Things
}
public static NonAttack(BattleActor actor, BattleActor target)
{
// Do Other Things
}
}
答案 0 :(得分:2)
尝试使用CreateDelegate方法。只有当你知道方法的签名时它才会起作用。
http://msdn.microsoft.com/en-us/library/system.delegate.createdelegate.aspx
UPD (tnx对Chris Sinclair):
使用
的例子lookup.Add(methodInfo.Name
, (SkillEffect)Delegate.CreateDelegate(typeof(SkillEffect), methodInfo));
答案 1 :(得分:1)
从代码中看起来你正在寻找一个委托而不是一个方法的引用。 (这在C#中并不存在)
我会将字典更改为Dictionary<string,Func<BattleActor,BattleActor> lookup
虽然这是个人偏好的问题,与您的问题无关。 (您可以使用以下代码中的Func<BattletActor,BattlActor>
替换SkillEffect
)
然后再做
Func<BattleActor,BattleActor> func = (Func<BattleActor,BattleActor>)
Delegate.CreateDelegate(typeof(Func<BattleActor,BattleActor>), methodInfo);
lookup.Add(methodInfo.Name,func);
仿函数是一个委托,可以像任何其他委托一样调用
lookup["mymethod"](actor,target);
您可以看到this question了解更多信息
答案 2 :(得分:0)
MethodInfo是方法的元数据。要实际调用您调用的方法(出乎意料!)MethodInfo.Invoke。
这会回答你的问题吗?
答案 3 :(得分:0)
如果您希望保存对方法本身的引用,以便可以调用它,我认为您无法。您真正要做的是通过MethodInfo
上的Invoke
方法调用它:
foreach (MethodInfo methodInfo in methods)
{
lookup.Add(methodInfo.Name, _____________);
}
然后称之为:
lookup[methodName].Invoke(null, BindingFlags.Public | BindingFlags.Static, null, args, null);