¿Y qué espera lograr con esto? Díganos qué está tratando de lograr, en lugar de cómo espera lograrlo.
Jon Skeet
@JonSkeet: Quiero poder llamar a una función desde el objeto. Actualmente obj.MyFunction();no se compila, aunque sé que el objeto real tiene esa función.
Paul Lassiter
@ psubsee2003: no, no lo hace, porque es una referencia de objeto que se pasa por interoperabilidad.
Paul Lassiter
3
@PaulLassiter: Si no conoce el tipo, ¿qué declara el MyFunctionmétodo?
Esta es realmente una respuesta inútil, que no merece votos a favor. La reflexión de un objeto de tipo object no producirá el "tipo real" del objeto, como lo pide OP. Además, su lógica de MyMethod es defectuosa porque obj puede ser de tipo A y también puede ser de tipo B. Su lógica no proporciona el "tipo real" (como lo solicitó OP); proporciona un tipo compatible, y no necesariamente el tipo deseado en eso.
Jazimov
utilice obj.GetType (). Eso definitivamente devolverá su tipo real.
JSON
3
¿Qué tal JsonConvert.DeserializeObject (object.ToString ());
Ésta no es una respuesta satisfactoria. La pregunta de OP no tiene nada que ver con Json o serialización.
@ user12637955 esta es en realidad una respuesta funcional, pero tiene una mayor complejidad, debido al encajonamiento y desempaquetado, es decir, objeto -> ToString () -> al tipo concreto. Para ser más preciso, debería verse así:var myType = JsonConvert.DeserializeObject<MyType>(object.ToString());
Coca Cola
1
En mi caso, AutoMapper funciona bien.
AutoMapper puede mapear hacia / desde objetos dinámicos sin ninguna configuración explícita:
Puede que este método no sea el más eficaz, pero es sencillo y funciona.
Realiza dos operaciones: primero llama a .ToString () que es básicamente una serialización, y luego la deserialización usando Newtonsoft nuget (que debe instalar).
public T Format<T>(Object obj)=>JsonConvert.DeserializeObject<T>(obj.ToString());
Debe describir su respuesta brevemente para los futuros lectores.
Suraj Kumar
0
Si su MyFunction()método está definido solo en una clase (y sus descendientes), intente
voidMyMethod(Object obj){var o = obj asMyClass;if(o !=null)
o.MyFunction();}
Si tiene una gran cantidad de clases no relacionadas que definen la función que desea llamar, debe definir una interfaz y hacer que sus clases definan esa interfaz:
interfaceIMyInterface{voidMyFunction();}voidMyMethod(Object obj){var o = obj asIMyInterface;if(o !=null)
o.MyFunction();}
Conviértalo a su tipo real si ahora el tipo, por ejemplo, está orientado desde la clase llamada abc. Puede llamar a su función de esta manera:
(abc)(obj)).MyFunction();
si no conoce la función, se puede hacer de otra manera. No siempre es fácil. Pero puedes encontrarlo de alguna manera por su firma. Si este es tu caso, háznoslo saber.
Esto es ilógico. En realidad, no conoce el tipo real. ¿Cómo se supone que vas a hacer eso?
Allen Linatoc
-2
Implement an interface to call your function in your methodinterfaceIMyInterface{voidMyinterfaceMethod();}IMyInterfaceMyObj= obj asIMyInterface;if(MyObj!=null){MyMethod(IMyInterfaceMyObj);}
obj.MyFunction();
no se compila, aunque sé que el objeto real tiene esa función.MyFunction
método?Respuestas:
Si conoce el tipo real, simplemente:
Si no conoce el tipo real, entonces: no realmente, no. En su lugar, tendría que usar uno de:
Por ejemplo:
fuente
as
para encasillamiento ytype(of: ClassName)
función para verificar el tipo de instancia.No creo que pueda (no sin reflexión), también debe proporcionar un tipo a su función:
UPD :
Esto puede funcionar para usted:
fuente
¿Qué tal JsonConvert.DeserializeObject (object.ToString ());
fuente
var myType = JsonConvert.DeserializeObject<MyType>(object.ToString());
En mi caso, AutoMapper funciona bien.
AutoMapper puede mapear hacia / desde objetos dinámicos sin ninguna configuración explícita:
De manera similar, puede mapear directamente desde diccionarios a objetos, AutoMapper alineará las claves con los nombres de las propiedades.
más información https://github.com/AutoMapper/AutoMapper/wiki/Dynamic-and-ExpandoObject-Mapping
fuente
Puede que este método no sea el más eficaz, pero es sencillo y funciona.
Realiza dos operaciones: primero llama a .ToString () que es básicamente una serialización, y luego la deserialización usando Newtonsoft nuget (que debe instalar).
fuente
Si su
MyFunction()
método está definido solo en una clase (y sus descendientes), intenteSi tiene una gran cantidad de clases no relacionadas que definen la función que desea llamar, debe definir una interfaz y hacer que sus clases definan esa interfaz:
fuente
Conviértalo a su tipo real si ahora el tipo, por ejemplo, está orientado desde la clase llamada abc. Puede llamar a su función de esta manera:
si no conoce la función, se puede hacer de otra manera. No siempre es fácil. Pero puedes encontrarlo de alguna manera por su firma. Si este es tu caso, háznoslo saber.
fuente
Transmitir al tipo real es fácil:
fuente
fuente