استدعاء يتم إنشاء أساليب التجمع عن طريق التفكير من صاحبها في صافي

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

  •  27-10-2019
  •  | 
  •  

سؤال

أنا أعرف كيفية إنشاء بعض الكائن عن طريق التفكير وتمرير بعض الحجج.

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

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

control.Maximize("true")

سؤالي هو ما إذا كان هناك نهج للحصول على معلومات من "عنصر التحكم" إلى "مالك" هذا "التحكم".

لذلك أعتقد أنه يجب أن يكون هناك طريقة ما للتفاعل ثنائي الاتجاه بين المالك والتجميع الذي تم إنشاؤه.

على سبيل المثال داخل بعض الموقت أريد الحصول على حالات "السيطرة" بشكل دوري.

foreach(...)
{

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

}

هنا يمكننا أن نرى كيفية تمرير المعلمات

لذا ما أحتاجه هو استعادة بعض الأشياء التي تم إرجاعها.

شكرا لكم مقدما على أي فكرة مفيدة إخوتي وأخواتي في البرمجة!

هل كانت مفيدة؟

المحلول

لاستدعاء طريقة محددة على الطبقات في تجميع آخر ، تحتاج إلى شيء من هذا القبيل:

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;
    }
  }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top