Я немного упростил ваш код, чтобы продемонстрировать, как мне это сделать. Прежде всего, не создавайте специальный класс DelegateInfo - по возможности придерживайтесь стандартной библиотеки отражений .NET. Они проделали действительно хорошую работу, но для того, чтобы научиться, нужно время.
Вот код:
private const string methodName = "Execute";
public static void Main()
{
ExampleClass1 e1 = new ExampleClass1();
ExampleClass2 e2 = new ExampleClass2();
ExampleClass3 e3 = new ExampleClass3();
/* Code below Simulates: "e3.GetString = e2.Execute;" */
var method = e2.GetType().GetMethod(methodName);
Type methodType = method.ReturnType;
// Create a Func<T> that will invoke the target method
var funcType = typeof(Func<>).MakeGenericType(methodType);
var del = Delegate.CreateDelegate(funcType, e2, method);
var properties = e3.GetType().GetProperties();
for (int i = 0; i < properties.Length; i++)
{
if (properties[i].PropertyType.IsAssignableFrom(funcType)) {
properties[i].SetValue(e3, del );
}
}
/* Code above Simulates: "e3.GetString = e2.Execute;" */
e2.GetNumber = e1.Execute;
e3.Execute();
// Read the key
Console.ReadKey();
}
public class ExampleClass3
{
public Func<String> GetString { get; set; }
public Func<int> GetInt { get; set; }
public ExampleClass3()
{ }
public object Execute()
{
Console.WriteLine(GetString());
return null;
}
}
public class ExampleClass2
{
public Func<int> GetNumber { get; set; }
public string Execute() => $"Your Number Is {GetNumber()}";
}
public class ExampleClass1
{
public int number = 5;
public int Execute() => number;
}
Прежде всего, обратите внимание, как я избавился от пользовательских определений делегатов в пользу Func. Это будет гораздо проще работать в общем виде. Обратите внимание, как ExampleClass3 определяется сейчас:
public class ExampleClass3
{
public Func<String> GetString { get; set; }
public Func<int> GetInt { get; set; }
public ExampleClass3()
{ }
public object Execute()
{
Console.WriteLine(GetString());
return null;
}
}
Я могу использовать тот факт, что все эти функции имеют тип Func, чтобы разработать общее решение для присвоения им значения. Основываясь на типе возврата целевого метода, я могу создать делегат Func соответствующего типа (и связать его с конкретным рассматриваемым экземпляром e2):
var funcType = typeof(Func<>).MakeGenericType(methodType);
var del = Delegate.CreateDelegate(funcType, e2, method);
Теперь я могу напрямую назначить этого делегата в качестве значения любого свойства с соответствующим типом делегата:
var properties = e3.GetType().GetProperties();
for (int i = 0; i < properties.Length; i++)
{
if (properties[i].PropertyType.IsAssignableFrom(funcType)) {
properties[i].SetValue(e3, del );
}
}
Надеюсь, это поможет:)