如何通过反射从不同的程序集中使用内部委托参数调用内部方法?

但在

我没有类型的源代码,需要使用内部参数调用内部方法。

有没有办法做这样的事情:Set.InOrderTreeWalk((object o) => o != null)

namespace assembly_1
{
    internal delegate bool TreeWalkPredicate<T>(Set<T>.Node node);
    public class Set<T>
    {
        private Node[] nodes;
        internal bool InOrderTreeWalk(TreeWalkPredicate<T> action)
        {
            foreach (var node in nodes)
            {
                if (!action(node))
                    return false;
            }

            return true;
        }

        internal class Node
        {
            public T Item;
        }
    }
}
疯狂反射

在我进入它之前,插入关于实现细节如何在内部出于某种原因的标准免责声明,如果某些内容发生变化并且破坏了您的反射代码,作者不欠您解释。


从表面上看,参数是内部委托类型的事实确实让这有点麻烦,但实际上有一种方便的方法来获取它:获取MethodInfo我们要调用的方法的 ,然后检查它的参数。

让我们假设我们已经有了这个变量,并分配了一个实例:

Set<MyNode> set;

...并且该MyNode类型已在某处声明。我们要Set<MyNode>.InOrderTreeWalk为集合中的每个节点调用以下方法:

private bool MyPredicate(Set<MyNode>.Node node)
{
    return true;
}

没有太多内容,只需按照评论进行操作:

// Get the method we want to call.
MethodInfo inOrderTreeWalkMethod = set.GetType().GetMethod(
    "InOrderTreeWalk", BindingFlags.NonPublic | BindingFlags.Instance);

// Get the internal delegate type from the parameter info.  The type retrieved here
// is already close-constructed so we don't have to do any generic-related manipulation.
Type treeWalkPredicateType = inOrderTreeWalkMethod.GetParameters()[0].ParameterType;

// Get the method we want to be called for each node.
MethodInfo myPredicateMethod = GetType().GetMethod(
    nameof(MyPredicate), BindingFlags.NonPublic | BindingFlags.Instance);

// Create the delegate.  This is where the magic happens.  The runtime validates
// type compatibility and throws an exception if something's wrong.
Delegate myPredicateDelegate = myPredicateMethod.CreateDelegate(treeWalkPredicateType, this);

// Call the internal method and pass our delegate.
bool result = (bool)inOrderTreeWalkMethod.Invoke(set, new object[] { myPredicateDelegate });

假设您已经提供了有关您正在使用的组件的足够信息,并且除非信任级别存在任何问题,否则应该这样做。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在不计入内部委托的情况下捕获所有模拟侦查类方法的调用

自定义 UITextView 如何支持 2 个委托 - 内部委托和外部委托?

使用反射具有参数调用内部类方法

在动态程序集中使用泛型参数调用委托(func/action)

如何在JAVA中使用反射从不同的类调用类的函数?

从不同的组件调用组件内部的函数

在结构方法内部使用反射调用结构的方法

从不同位置调用时,无法在方法参数中使用List <Future <?>>

如何从不同的程序集中获取EmbeddedResource?

如何通过反射获取受保护的内部方法

如何使用反射在库中存在的此内部类上调用方法?

如何在Java中使用反射实例化内部类?

如何在 C# 中使用反射调用带有 Action<T> 参数的泛型方法

如何在Groovy中使用反射调用具有空参数值的方法?

在Swift中,我如何拥有一个具有内部和外部委托的UIScrollView子类?

如何在SSRS中使用Lookup从不同数据集中获取基于年和月的比率

如何使用Powermock验证内部方法调用?

通过反射调用变量参数方法

如何使用事件总线从不同的文件调用方法

如何使用反射来调用与原始参数的方法?

如何使用反射调用带有参数的方法?

如何使用反射调用接受 Func<> 参数的方法?

如何在 Java 中使用反射调用 Kotlin 对象方法?

如何累积以内部变量作为参数的调用setter方法?

通过反射检查方法内部是否使用了特定的扩展方法

Javascript:如何使用apply方法传递参数数组,然后在调用的函数内部访问它

如何使用不同的或集团通过内部连接?

你如何从不同的包调用方法?

如何从不同的类调用 ActionPerformed 方法