Richiama i metodi dell'assembly viene creato per riflessione dal suo proprietario in .NET
-
27-10-2019 - |
Domanda
So come creare qualche oggetto per riflessione e passare alcuni argomenti.
Dim assembly As System.Reflection.Assembly
Dim control As Object
assembly = System.Reflection.Assembly.Load("WpfControlLibrary1")
control = assembly.CreateInstance("WpfControlLibrary1.Main")
control.Maximize("true")
La mia domanda è se esiste un approccio per ottenere informazioni dal "controllo" al "proprietario" di quel "controllo".
Quindi immagino che dovrebbe essere un modo per avere un'interazione bidirezionale tra il proprietario e l'assieme creato.
Ad esempio, all'interno di alcuni Timer voglio ottenere periodicamente gli stati del "controllo".
foreach(...)
{
var state = control.GetState(); // ????? Is it possible ?
Sleep(10000);
}
Qui possiamo vedere come passare i parametri
Quindi quello che mi serve è recuperare alcuni oggetti restituiti.
Grazie in anticipo per qualsiasi indizio utile miei fratelli e sorelle sulla programmazione!
Soluzione
Per invocare il metodo definito sulle classi in un altro assembly, è necessario qualcosa del genere:
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" });
Questo richiamerà il metodo SetFullName
della classe OtherAssemblyClass
dell'assembly OtherAssembly
sull'oggetto control
, utilizzando i parametri "FirstName"
e "LastNameski"
object result = controlType.InvokeMember("GetFullName",
BindingFlags.InvokeMethod, null, control, null);
Questo invocerà un metodo chiamato GetFullName
sullo stesso oggetto, che non accetta parametri (da qui l'ultimo null
nella chiamata) e restituisce una stringa.
Console.WriteLine(result.GetType().FullName);
Questo stamperà "System.String"
Console.WriteLine(result);
Questo stamperà "FirstName LastNameski"
.
nell'esempio, l'altro assembly contiene questa 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;
}
}
}