Я очень мало изменил ваш пример и получил код, который компилируется и выполняется до конца.Есть ли вероятность, что ваш DB.Wiz () выдает исключение?Если нет, нам может потребоваться дополнительная информация о том, какая среда выполнения дает вам эту проблему, или более полный пример.Ниже приведен пример правильного вывода "Hello, World!"
.Net 4.6.1 Решение
Проект ConsoleApp, имеющий ссылку на пространство имен библиотеки классов Internal
.Я изменил ваш dynMethod2.Invoke()
для передачи пустого объекта [], так как ваш пример не компилировался с одним параметром в Invoke
.Также убраны лишние скобки вокруг лямбда-выражения.
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[]{ });
})
});
}
Библиотека классов Internal
пространство имен.
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!");
}
}
}