Masz bardzo złą architekturę. Masz też fatalne nazewnictwo elementów języka:
- nie używa w nich języka polskiego,
- standardy określają, że nazwy zmiennych lokalnych rozpoczyna się z małej litery, metody z dużej;
- nie używa się podkreśleń, bo to nie PHP (może z wyjątkiem początków nazw prywatnych pól);
- nie używa się skrótów, bo.po kilku miesiącach nikt nie będzie wiedział, jak się je rozszyfrowuje.
Powinieneś takie rzeczy załatwić interfejsem, do którego dostęp ma i "wstrzykiwany" formularz, i aplikacja. Ale jeśli ten kod nie jest Twojego autorstwa i nie masz wpływu na architekturę tego rozwiązania, to masz dwa podejścia.
- Zamiast
Form
użyj dynamic
(albo zrzutuj na dynamic
): ((dynamic)vaccinationReport).DocumentationId = newDocumentationId;
.
- Refleksja:
vaccinationReport.GetType().GetProperty("DocumentationId").SetValue(vaccinationReport, newDocumentationId);
Żaden z tych sposobów nie jest dobry, bo nie są odporne na zmiany w formularzu. Co najwyżej możesz złapać wyjątek, ale formularz nie zadziała.
Rozwiązanie problemu:
Na początku musiałem zmienić trochę klasę szczepienia, która jest wczytywana z biblioteki dll.
public partial class szczepienia : Form
{
private int _id_dok;
public szczepienia(int ID_DOK)
{
_id_dok = ID_DOK;
InitializeComponent();
}
następnie w głównym formularzu, który ma wczytać zawartość formularza z biblioteki dll i przekazać do niego wartość zmiennej dałem poniższy kod:
Assembly assembly = Assembly.LoadFile(AppDomain.CurrentDomain.BaseDirectory + @"raporty.dll");
Type type = assembly.GetType("raporty.szczepienia");
object[] arguments = {2 }; // Wartość którą chce przekazać do formularza szczepienia
Form Raporcik = Activator.CreateInstance(type, arguments) as Form;
Raporcik.Show();