Typ dynamisch ermitteln und als Typparameter übergeben

  • C#
  • .NET (FX) 4.5–4.8

Es gibt 3 Antworten in diesem Thema. Der letzte Beitrag () ist von Duke.

    Typ dynamisch ermitteln und als Typparameter übergeben

    Hi,

    ich versuche grade automatisch Daten typgerecht an eine Combobox zuzuweisen.
    Dazu hole ich mir von den Items der Combobox einen ValueMember[4] und frage den Typ ab [12].
    Diesen will ich dann in [19] als Typ an den Funktionsaufruf übergeben.

    Irgendwie klappt das aber nicht so...Wie kann ich das richtig machen.

    C#-Quellcode

    1. if (cbSender.ValueMember != null)
    2. {
    3. var Props = cbSender.Items[0].GetType().GetProperties();
    4. Type ValueType;
    5. String TypeName;
    6. foreach (var item in Props)
    7. {
    8. if(item.Name == cbSender.ValueMember)
    9. {
    10. ValueType = Props[0].PropertyType;
    11. TypeName = ValueType.FullName;
    12. break;
    13. }
    14. }
    15. cbSender.SelectedValue = Program.DBCon.getIniValue<ValueType>(m_InitGroup, Parts.IDString, Parts.DefaultValue, false, true);

    Duke schrieb:

    Irgendwie klappt das aber nicht so.
    Wie äußert sich das?
    Wie ist getIniValue deklariert?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    deine variablen und method benennung entspricht nicht den .Net conventionen, desweiteren ist eine variable mit dem namen "ValueType" sehr ungünstig.
    nichtsdestotrotz, was du suchst ist die funktion MethodInfo.MakeGenericMethod, ausm kopf in etwa so:

    C#-Quellcode

    1. var openGenericMethod = typeof(...).GetMethod("getIniValue", ...);
    2. var closedGenericMethod = openGenericMethod.MakeGenericMethod(new [] { ValueType });
    3. var x = closedGenericMethod.Invoke(...);

    alles weitere verrät dir das msdn.
    Danke, klappt.

    C#-Quellcode

    1. foreach (var item in Props)
    2. {
    3. if(item.Name == cbSender.ValueMember)
    4. {
    5. //ValueType = (Props[0].get);
    6. //TypeName = ValueType.FullName;
    7. var v1 = typeof(DBConnector).GetMethod("getIniValue", new Type[] {typeof(String), typeof(String), typeof(String) , typeof(Boolean) , typeof(Boolean)} );
    8. var v2 = v1.MakeGenericMethod(item.GetMethod.ReturnType);
    9. Object Test = v2.Invoke(Program.DBCon, new object[] { m_InitGroup, Parts.IDString, Parts.DefaultValue, false, true });
    10. break;
    11. }
    12. }


    .. und schicke Namen denke ich mir jetzt auch gleich aus ;)