为了账号安全,请及时绑定邮箱和手机立即绑定

C#反射返回方法内容为委托

C#反射返回方法内容为委托

C#
慕侠2389804 2021-11-07 20:22:12
我正在开发一个能力系统,该系统在 Abilities 类中具有预先编写的函数并处理运行时方法,因此我也将委托用于 lambda 表达式。显然我需要使用反射调用预先编写的方法。我使用包装方法的委托:public delegate void AbilityAction();Abilities 类包含所有的能力方法。我想让以下部分静态:var mi = Abilities.instance.GetType ().GetMethod (abilities[i].name, BindingFlags.Instance | BindingFlags.NonPublic) as MethodInfo; AbilityAction code = (AbilityAction)Delegate.CreateDelegate(typeof(AbilityAction), this, mi);然后调用它:AbilityAction code = GetMethodInClass(abilities[i].name /*e.g. MegaJump*/, Abilities, AbilityAction);我已经尽力了,但它给了我错误:这个约束不能是特殊类“System.Delegate”public static Delegate GetMethodInClass<T, D>(string methodName, T sourceClass, D delegateType) where D : Delegate {    var mi = sourceClass.GetType().GetMethod (methodName, BindingFlags.Instance | BindingFlags.NonPublic) as MethodInfo;        return (D)Delegate.CreateDelegate(typeof(delegateType), this, mi);}提前致谢。
查看完整描述

1 回答

?
qq_花开花谢_0

TA贡献1835条经验 获得超7个赞

如果没有委托类型和示例方法,我无法看到您实际尝试做什么,但是......尽我所能阅读行间,这里有一个类似的例子:


using System;

using System.Reflection;


class Foo

{


    public int Bar(string whatever) => whatever.Length;

}


delegate int AbilityAction(string name);

static class Program

{



    static void Main(string[] args)

    {

        var foo = new Foo();

        var action = GetMethodInClass<AbilityAction>(nameof(foo.Bar), foo);


        int x = action("abc");

        Console.WriteLine(x); // 3

    }


    public static D GetMethodInClass<D>(string methodName, object target) where D : Delegate

    {

        var mi = target.GetType().GetMethod(methodName,

            BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);

        return (D)Delegate.CreateDelegate(typeof(D), target, mi);

    }

}

注意:如果您没有 C# 7.3,该方法需要一些小的调整:


    public static D GetMethodInClass<D>(string methodName, object target) where D : class

    {

        var mi = target.GetType().GetMethod(methodName,

            BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);

        return (D)(object)Delegate.CreateDelegate(typeof(D), target, mi);

    }


查看完整回答
反对 回复 2021-11-07
  • 1 回答
  • 0 关注
  • 229 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信