Wywołanie generycznej metody z T odczytanym podczas runtime

0

Cześć,

w bazie danych trzymany jest sobie xml z klucz (nazwa property), value.
W aplikacji ten xml jest pobierany i miałyby zostać te property uzupełnione.

Wyciągam sobie w foreachu po nazwie:

var prop = this.GetType().GetProperty(item.Id);
var type = prop.PropertyType;

Tylko mam problem jak próbuję przekonwertować stringa do odpowiedniego typu.

Mam taka metode generyczną:

public static T ConvertGeneric<T>(string input)
        {
            try
            {
                var converter = TypeDescriptor.GetConverter(typeof(T));
                if (converter != null)
                    return (T)converter.ConvertFromString(input);

                return default;
            }
            catch (NotSupportedException)
            {
                return default;
            }
        }

ale nie potrafię jej wywołać.

Przy takiej próbie:

var type = prop.PropertyType;
var converted = ParseHelper.ConvertGeneric<type>(item.Value);

dostaję informację, że type jest zmianną a używam jej jak Type.

Znalazłem gdzieś taka opcję:

var type = prop.PropertyType;
MethodInfo method = typeof(ParseHelper).GetMethod(nameof(ParseHelper.ConvertGeneric));
MethodInfo generic = method.MakeGenericMethod(type);
var res = generic.Invoke(this, null);

tylko w tym wypadku res jest typu object, a ja chcę żeby on był typu type.

Co mi umyka? Prośba o wsparcie.

0

Skąd CLR ma wiedzieć jakiego rezultatu z wywołania poprzez refleksję się spodziewasz? Sygnatura metody Invoke pokazuje jasno co jest zwracane - object - i jest to jedyny rozsądny typ.

Jeśli chcesz tę wartość przypisać elementowi klasy to możesz zrobić to również refleksją, poprzez użycie metody SetValue dla danego PropertyInfo

2

Próbujesz rozwiązać problem który sam stworzyłeś - robisz generyczną funkcję tylko po to żeby ją wywołać przy pomocy refleksji gdy możesz po prostu przyjąć Type jako parametr bo TypeDescriptor.GetConverter nie jest generyczne

Wystarczy

var prop = this.GetType().GetProperty(item.Id);
var converter = TypeDescriptor.GetConverter(prop.PropertyType);
if (converter != null)
    prop.SetValue(this, converter.ConvertFromString(input));
0

@obscurity: Dziękuję ;) Cóż - chciałem bohatersko pokonać problem, który sam stworzyłem :D

1 użytkowników online, w tym zalogowanych: 0, gości: 1