Invoque os métodos da montagem é criada pela reflexão de seu proprietário no .NET
-
27-10-2019 - |
Pergunta
Eu sei como criar algum objeto por reflexão e passar alguns argumentos.
Dim assembly As System.Reflection.Assembly
Dim control As Object
assembly = System.Reflection.Assembly.Load("WpfControlLibrary1")
control = assembly.CreateInstance("WpfControlLibrary1.Main")
control.Maximize("true")
Minha pergunta é se existe uma abordagem para obter informações do "controle" para "o proprietário" desse "controle".
Então, acho que deve haver alguma forma de ter interação bidirecional entre o proprietário e a montagem criada.
Por exemplo, dentro de algum Timer, quero obter os estados do "controle" periodicamente.
foreach(...)
{
var state = control.GetState(); // ????? Is it possible ?
Sleep(10000);
}
Aqui podemos ver como passar os parâmetros
Então, o que eu preciso é recuperar algum objeto devolvido.
Agradeço antecipadamente por qualquer pista útil, meus irmãos e irmãs da programação!
Solução
Para invocar o método definido em classes em outro assembly, você precisa de algo assim:
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" });
Isso invocará o método SetFullName
da classe OtherAssemblyClass
do assembly OtherAssembly
no objeto control
, usando os parâmetros "FirstName"
e "LastNameski"
object result = controlType.InvokeMember("GetFullName",
BindingFlags.InvokeMethod, null, control, null);
Isso invocará um método chamado GetFullName
no mesmo objeto, que não aceita parâmetros (portanto, o último null
na chamada) e retorna uma string.
Console.WriteLine(result.GetType().FullName);
Isso imprimirá "System.String"
Console.WriteLine(result);
Isso imprimirá o "FirstName LastNameski"
.
no exemplo, o outro assembly contém esta classe:
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;
}
}
}