Richiama i metodi dell'assembly viene creato per riflessione dal suo proprietario in .NET

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

  •  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!

È stato utile?

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;
    }
  }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top