Здравствуйте, Sinclair, Вы писали:
S>>> Вот у тебя есть имя метода и параметры. По этим данным надо найти реальный метод.
S>>>.Net Core, AppDomain, WCF, RPC маршалинг по Tcp/Ip свой велосипед
_FR>>Спасибо за очень понятное объяснение. Конечно, это всё объясняет.
S>Да в целом-то всё понятно. Вот у нас есть некий object, а ещё — string methodName, плюс object[] arguments.
S>И хочется воспроизвести все нюансы перегрузки, реализованные в C#.
S>Внезапно выясняется, что когда мы видим в коде foo.bar(baz1, baz2), то там происходит много всяких подкапотных интересностей.
Да, там много сложностей и действительно задача "в самом общем виде" не самая простая. Но 1) заметно проще, чем у компилятора и 2) думаю, если не хочется самому это всё выписывать, можно воспользоваться тем, что компилятор создаёт для вызова метода с dynamic-параметрами, типа такого:
S>using System;
S>public class Program
S>{
S> public class Foo
S> {
S> public string bar(object a, string b) => "1";
S> public string bar(int a, object b) => "2";
S> public string bar(object a, object b) => "3";
S> public string bar<A>(A a, string b) => "4";
S> public string bar<B>(int a, B b) => "5";
S> public string bar(params object[] xs) => "6";
S> public string bar(int a, params string[] b) => "7";
S> }
public class Foo2
{
public static string bar(Foo foo, dynamic a, dynamic b) => foo.bar(a, b);
}
S> public static void Main()
S> {
S> var foo = new Foo();
S> Console.WriteLine(Foo2.bar(foo, 42, "42")); // Вызываем "наш" метод заместо искомого
S> }
S>}