استدعاء يتم إنشاء أساليب التجمع عن طريق التفكير من صاحبها في صافي
-
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;
}
}
}