Несомненно, элементы этого вопроса были заданы раньше, но у меня возникли проблемы с поиском ответа. (Отказ от ответственности: это связано, но отдельно от недавнего вопроса, который я задал).Получить фактический тип параметра общего объекта
У меня есть метод, как это:
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);
}
}
Это прекрасно работает, когда я называю это так:
string s = "blah";
Method(memberInfo, s);
Однако, мне нужно вызвать этот метод с использованием универсального типа, так что я звоню это так:
Type valueType = someType;
object passValue = someMethod.MakeGenericMethod(new Type[] { valueType }).Invoke(this, new object[] { });
/* Call my original method */
Method(memberInfo, passValue);
Теперь IntelliSense знает, что 'значение' в методе < T> я s любой тип valueType (например, «FooObject»). Но «T» - это объект, что означает, что список < FooObject> равен не, назначаемый из списка < T> (т. Е. Список < объект>).
Я попытался использовать Convert.ChangeType для переменной ('passValue') заранее, но это было не более полезно.
Как нет способа передать переменную переменной типа Type, как мне обойти это?
Лучшее решение, чтобы как-то не полагаться на IsAssignableFrom и сделать более простую проверку типа, будет ли это работать? Проблема заключается в том, что я не уверен, что смогу правильно применить элемент value, если только T не является типом элемента memberValue.
'GetValueType()' - это метод расширения в вашем коде. Но даже не видя его кода, кажется, что метод 'Method' не делает ... ничего? Я бы хотел дать вам улучшенное решение, но я действительно не могу понять, что вы пытаетесь сделать здесь. –
Да, извините, что getvaluetype - это всего лишь метод вызова FieldType/PropertyType для данного MemberInfo в зависимости от конкретного типа MemberType. Метод добавляет объект к MemberInfo, который представляет список (то есть .a поле или свойство, которое является списком) –