Function.createDelegate

Function.createDelegate(instance,method){}得到一个方法引用,执行它时则会调用method方法,并且保证method方法的上下文this引用为instance
Function.createCallback(method,context)得到一个方法引用,执行它时则会调用method方法,并将context作为额外的参数传入

<script language="javascript" type="text/javascript">   
   var obj =
   {
    text : "Hello",
    onClick : function(e, arg)
    {
     alert(this.text + " " + arg);
    }
   }
   
   // obj.onClick();
   // $addHandler($get("btn"), "click", obj.onClick);
   // var onClickDelegate = Function.createDelegate(obj, obj.onClick);
   var onClickDelegate = Function.createCallback(
    Function.createDelegate(obj, obj.onClick), "World");
   $addHandler($get("btn"), "click", onClickDelegate);
  </script>

对不起,我的描述再次出现了混淆。`MethodBase` 类型本身并不包含 `CreateDelegate` 方法,这是从 `MethodInfo` 或 `Delegate` 类中获取的。当你已经得到了 `MethodBase`,通常意味着你已经有了某个方法的信息,但为了将其转换为一个可以直接调用的委托(如动态委托),你需要使用 `MethodInfo` 对象来创建。以下是修正后的代码段: ```csharp if (methodBase is MethodInfo methodInfo) { // 获取 MethodAttributes 可能抛出异常,所以通常我们会检查一下方法是否公开实例可访问 if ((methodInfo.Attributes & MethodAttributes.Public) == MethodAttributes.Public && (methodInfo.Attributes & MethodAttributes.Virtual) == MethodAttributes.Virtual) { object[] args = { /* 如果有参数的话,将参数数组放在这里 */ }; try { // 创建具有指定flag的委托 Delegate target = methodInfo.CreateDelegate(typeof(Invoker), _manager); target.DynamicInvoke(args); // 安全调用方法 } catch (TargetInvocationException tie) { Exception innerException = tie.InnerException; throw Oops.Oh($"调拨策略存在错误:{innerException.Message}"); } } else { throw Oops.Oh($"调拨策略不是公开实例可访问的方法!"); } } ``` 在这个例子中,首先判断 `methodBase` 是否是 `MethodInfo` 类型,然后才进行进一步的操作,因为只有 `MethodInfo` 才有创建委托的能力。请注意,在实际应用中,可能会根据具体的场景对属性检查进行调整。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值