Вызов методов сборки создается путем отражения от ее владельца в .NET - PullRequest
0 голосов
/ 07 сентября 2011

Я знаю, как создать какой-либо объект с помощью отражения и передать несколько аргументов.

Dim assembly As System.Reflection.Assembly
Dim control As Object

assembly = System.Reflection.Assembly.Load("WpfControlLibrary1")
control = assembly.CreateInstance("WpfControlLibrary1.Main")

control.Maximize("true")

Мой вопрос заключается в том, существует ли подход для передачи информации из "элемента управления" в "владельца" этого "control ".

Так что, я думаю, должен быть какой-то способ двунаправленного взаимодействия между владельцем и созданной сборкой.

Например, в каком-то таймере я хочу периодически получать состояния" элемента управления ".

foreach(...)
{

var state = control.GetState(); // ????? Is it possible ?
Sleep(10000);

}

Здесь мы можем увидеть, как передать параметры

Итак, мне нужно вернуть обратно некоторый возвращенный объект.

Заранее благодарю за любую полезную подсказку, мои братья и сестры в программировании!

1 Ответ

1 голос
/ 07 сентября 2011

Чтобы вызвать метод, определенный для классов в другой сборке, вам нужно что-то вроде этого:

Assembly assembly = Assembly.Load("OtherAssembly");
Type controlType = assembly.GetType("OtherAssembly.OtherAssemblyClass");
object control = Activator.CreateInstance(controlType);

controlType.InvokeMember("SetFullName", BindingFlags.InvokeMethod, null, 
                         control, new object[] { "FirstName", "LastNameski" });

Это вызовет метод SetFullName класса OtherAssemblyClass сборки OtherAssembly для объекта control, используя параметры "FirstName" и "LastNameski"

object result = controlType.InvokeMember("GetFullName", 
                            BindingFlags.InvokeMethod, null, control, null);

Это вызовет метод с именем GetFullName для того же объекта, который не принимает параметров (следовательно, последний null в вызове) и возвращает строку.

Console.WriteLine(result.GetType().FullName);

Это распечатает "System.String"

Console.WriteLine(result);

Это распечатает "FirstName LastNameski".


в этом примере другая сборка содержит этот класс:

namespace OtherAssembly
{
  public class OtherAssemblyClass
  {
    private string firstName;
    private string lastName;

    public string GetFullName()
    {
        return firstName + " " + lastName;
    }

    public void SetFullName(string first, string last)
    {
        firstName = first;
        lastName = last;
    }
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...