我对您的示例做了很少的更改,得到了编译并运行到完成的代码。您的DB.Wiz()是否有可能引发异常?如果不是,我们可能需要更多关于哪个运行时给你这个问题的信息,或者一个更完整的例子。下面的示例正确地显示了输出
"Hello, World!"
ConsoleApp项目,引用了类库命名空间
Internal
. 我改变了你的想法
dynMethod2.Invoke()
Invoke
. 还删除了lambda表达式周围的冗余paren。
private static void Main(string[] args)
{
Internal.Eng eng = new Internal.Eng();
var tt = eng.GetType().Assembly;
var dd = tt.GetType("Internal.DB");
var kk = typeof(Action<>);
Type[] targs = { dd };
var qq = kk.MakeGenericType(targs);
MethodInfo dynMethod = eng.GetType().GetMethod("Foo", BindingFlags.NonPublic | BindingFlags.Instance, null, new Type[] { qq }, null);
dynMethod.Invoke(eng, new object[] {
(Action<object>)(db=>{
MethodInfo dynMethod2 = db.GetType().GetMethod("Wiz", BindingFlags.NonPublic | BindingFlags.Instance);
dynMethod2.Invoke(db, new object[]{ });
})
});
}
类库
内部的
命名空间。
using System;
namespace Internal
{
public class Eng
{
internal void Foo(Action<DB> act) => act(new DB());
}
internal class DB
{
internal void Wiz()
{
Console.WriteLine("Hello, World!");
}
}
}