c# - 从非静态方法构建静态委托(delegate)

标签 c# delegates static

我需要为一个类的非静态方法创建一个委托(delegate)。复杂的是,在创建时我没有类的实例,只有它的类定义。在通话时,我手头有实例。因此我需要一种方法:

  1. 构建一个“不完整”的委托(delegate)给成员方法,缺少实例。
  2. 调用 1 的委托(delegate),明确传递该类的一个实例。

这两个都可以吗?如何? 注意:我愿意为第一个付出高昂的性能代价,但理想情况下,第二个不应比委托(delegate)调用贵很多。

最佳答案

您可以使用 Delegate.CreateDelegate为给定 MethodInfo 的特定目标实例动态构造委托(delegate)。您可以使用 Type.GetMethod 查找 MethodInfo。 (反射)并将其缓存以备后用创建委托(delegate)。

例如,这将获取“GetHashCode”方法并将其绑定(bind)到“this”实例:

        var method = typeof(Object).GetMethod("GetHashCode");
        var del = (Func<int>)Delegate.CreateDelegate(typeof(Func<int>), this, method);

如果方法有多个重载,则有更多微妙之处,但如有必要,您可以使用其他 GetMethod 参数来消除歧义。

关于c# - 从非静态方法构建静态委托(delegate),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4083028/

相关文章:

c# - 捕获异常、记录并再次抛出异常是好习惯吗?

c# - 如何为电子邮件消息中的占位符编码?

c# - 在接口(interface)中使用事件

c# - 如何声明返回相同类型的 Func Delegate 的 Func Delegate?

java - 避免 JavaFX 中跨类的静态

c# - DirectoryNotFoundException - 找不到部分路径

c++ - C++ 中的委托(delegate)

c# - 如何声明一个全局使用的变量

php - 关于静态页面的 CodeIgniter 教程

c# - XAML - IValueConverter 和Behavior 相互冲突,导致发生无限循环