Bez wątpienia elementy tego pytania zostały zadane wcześniej, ale mam problem ze znalezieniem odpowiedzi. (Zrzeczenie się: jest to powiązane, ale oddzielne od ostatnio zadawanego pytania).Uzyskaj rzeczywisty typ ogólnego parametru obiektu
Mam metodę tak:
public static void Method<T>(MethodInfo m, T value)
{
Type memberType = m.GetValueType();
if (memberType.IsAssignableFrom(typeof(List<T>))
{
object memberValue = Activator.CreateInstance(memberType);
((List<T>)memberValue).Add(value);
}
}
Działa to dobrze, gdy nazywam go tak:
string s = "blah";
Method(memberInfo, s);
Jednak muszę wywołać tej metody przy użyciu typu rodzajowego, więc „m nazywając go tak:
Type valueType = someType;
object passValue = someMethod.MakeGenericMethod(new Type[] { valueType }).Invoke(this, new object[] { });
/* Call my original method */
Method(memberInfo, passValue);
teraz intellisense wie, że 'wartość' w metodzie < T> i s dowolny typ valueType (powiedzmy "FooObject"). Ale "T" jest obiektem, co oznacza, że Lista można przypisać z Listy < T> (tj. Obiekt z Listy>> <>).
Próbowałem wcześniej użyć Convert.ChangeType na zmiennej ("passValue"), ale to nie było bardziej użyteczne.
Ponieważ nie ma sposobu na wyrzucenie zmiennej do typu zmiennej typu, jak to obejść?
Czy to najlepsze rozwiązanie, aby w jakiś sposób nie polegać na IsAssignableFrom i zrobić luźniejszą kontrolę typu, czy to zadziała? Problem polega na tym, że nie jestem pewien, czy będę w stanie prawidłowo obsłużyć wartość memberValue, chyba że "T" jest rzeczywiście typem elementu memberValue.
'GetValueType()' jest metodą rozszerzenia w kodzie. Ale nawet bez zobaczenia jego kodu, wygląda na to, że metoda "Metoda" nie robi ... nic? Chciałbym dać ci ulepszone rozwiązanie, ale naprawdę nie mogę zrozumieć, co próbujesz tutaj zrobić. –
Tak, przepraszam getvaluetype jest po prostu metodą wywoływania FieldType/PropertyType dla danego MemberInfo w zależności od określonego MemberType. Metoda dołącza obiekt do elementu MemberInfo, który reprezentuje listę (tj. Pole lub właściwość, która jest listą) –