Invoke les méthodes de l'ensemble est créé par la réflexion de son propriétaire dans .NET

StackOverflow https://stackoverflow.com/questions/7334670

  •  27-10-2019
  •  | 
  •  

Question

Je sais comment créer un objet par réflexion et passer quelques arguments.

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

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

control.Maximize("true")

Ma question est de savoir s'il y a une approche pour obtenir des informations de « contrôle » dans « le propriétaire » de ce « contrôle ».

Donc je suppose que devrait être un moyen d'avoir une interaction bidirectionnelle entre le propriétaire et créé l'assemblage.

Par exemple au sein de certains Minuteur je veux obtenir les états du « contrôle » périodiquement.

foreach(...)
{

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

}

Ici, nous pouvons voir comment passer les paramètres

Alors ce que je dois est de récupérer un objet retourné vers le haut.

Merci d'avance pour tout indice utile mes frères et sœurs dans la programmation!

Était-ce utile?

La solution

Pour Invoke méthode définie sur les classes dans une autre assemblée, vous avez besoin quelque chose comme ceci:

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" });

Ceci va appeler la méthode SetFullName du OtherAssemblyClass de classe de l'OtherAssembly d'assemblage sur la control de l'objet, en utilisant les paramètres "FirstName" et "LastNameski"

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

invoquera une méthode appelée GetFullName sur ce même objet, qui accepte aucun paramètre (d'où le dernier null dans l'appel) et retourne une chaîne.

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

imprimera "System.String"

Console.WriteLine(result);

imprimera "FirstName LastNameski".


dans l'exemple, l'autre ensemble contient cette 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;
    }
  }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top