Sin duda, ya se han formulado elementos de esta pregunta, pero me cuesta encontrar una respuesta. (Descargo de responsabilidad: esto está relacionado, pero separado de una pregunta reciente que hice).Obtiene el tipo real de un parámetro de objeto genérico
Tengo un método como este:
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);
}
}
Esto funciona bien cuando llamo así:
string s = "blah";
Method(memberInfo, s);
Sin embargo, tengo que llamar a este método utilizando un tipo genérico, por lo que Llamo así:
Type valueType = someType;
object passValue = someMethod.MakeGenericMethod(new Type[] { valueType }).Invoke(this, new object[] { });
/* Call my original method */
Method(memberInfo, passValue);
Ahora, intelisense sabe que el 'valor' en el Método < T> i s cualquier tipo valueType es (digamos 'FooObject'). Pero 'T' es un objeto, lo que significa que una Lista < FooObject> es no asignable de una Lista < T> (es decir, un objeto List <>).
He intentado utilizar Convert.ChangeType en la variable ('passValue') de antemano, pero eso ya no era útil.
Como no hay forma de convertir una variable al tipo de una variable de tipo, ¿cómo puedo evitar esto?
¿Es la mejor solución no confiar en IsAssignableFrom y hacer una comprobación más flexible de si esto funcionará? El problema con esto es que no estoy seguro de poder lanzar MemberValue correctamente a menos que 'T' sea realmente el tipo de elemento de memberValue.
'GetValueType()' es un método de extensión en su código. Pero incluso sin ver su código, parece que el método 'Método' no funciona ... ¿nada? Me gustaría ofrecerte una solución mejorada, pero realmente no puedo entender qué estás tratando de hacer aquí. –
Sí, lo siento getvaluetype es solo un método para llamar a FieldType/PropertyType para un MemberInfo dado, dependiendo del MemberType en particular. El método agrega un objeto a un MemberInfo que representa una lista (es decir, un campo o propiedad que es una lista) –