si tengo:¿Cómo convertir Object a su tipo real?
void MyMethod(Object obj) { ... }
¿Cómo puedo emitir obj
a lo que su tipo es real?
si tengo:¿Cómo convertir Object a su tipo real?
void MyMethod(Object obj) { ... }
¿Cómo puedo emitir obj
a lo que su tipo es real?
Si conoce el tipo real, entonces simplemente:
SomeType typed = (SomeType)obj;
typed.MyFunction();
Si no sabe el tipo real, entonces: no realmente, no. Usted tendría que utilizar en su lugar uno de:
Por ejemplo:
// reflection
obj.GetType().GetMethod("MyFunction").Invoke(obj, null);
// interface
IFoo foo = (IFoo)obj; // where SomeType : IFoo and IFoo declares MyFunction
foo.MyFunction();
// dynamic
dynamic d = obj;
d.MyFunction();
La conversión a tipo real es fácil:
void MyMethod(Object obj) {
ActualType actualyType = (ActualType)obj;
}
eso es muy divertido ... – Steve
Esto no es lógico. En realidad no sabes el tipo real. ¿Cómo se supone que debes hacer eso? –
no creo puede (no sin reflexión), también debe proporcionar un tipo a su función:
void MyMethod(Object obj, Type t)
{
var convertedObject = Convert.ChangeType(obj, t);
...
}
UPD:
Esto puede funcionar para usted:
void MyMethod(Object obj)
{
if (obj is A)
{
A a = obj as A;
...
}
else if (obj is B)
{
B b = obj as B;
...
}
}
Esto realmente es una respuesta inútil, no merecedor de votos positivos. La reflexión de un objeto de tipo objeto no arrojará el "tipo real" del objeto, como lo pidió OP. Además, su lógica MyMethod está 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 OP solicitó): proporciona un tipo compatible, y no necesariamente el tipo deseado en eso. – Jazimov
Implement an interface to call your function in your method
interface IMyInterface
{
void MyinterfaceMethod();
}
IMyInterface MyObj = obj as IMyInterface;
if (MyObj != null)
{
MyMethod(IMyInterface MyObj);
}
Si se define el método de MyFunction()
sólo en una clase (y sus descendientes), tratan
void MyMethod(Object obj)
{
var o = obj as MyClass;
if (o != null)
o.MyFunction();
}
If usted tiene un gran número de clases no relacionadas definir la función que desea llamar, debe definir una interfaz y hacer que sus clases definen esa interfaz:
interface IMyInterface
{
void MyFunction();
}
void MyMethod(Object obj)
{
var o = obj as IMyInterface;
if (o != null)
o.MyFunction();
}
moldeada a su tipo real si ahora el tipo, por ejemplo, se está orientado desde la clase llamada abc. Puede llamar a su función en esta forma:
(abc)(obj)).MyFunction();
si usted no sabe la función que se puede hacer de una manera diferente. No es fácil siempre Pero puedes encontrarlo de alguna manera por su firma. Si este es tu caso, deberías avisarnos.
En mi caso, AutoMapper funciona bien.
AutoMapper puede asignar a/de objetos dinámicos sin ninguna configuración explícita:
public class Foo {
public int Bar { get; set; }
public int Baz { get; set; }
}
dynamic foo = new MyDynamicObject();
foo.Bar = 5;
foo.Baz = 6;
Mapper.Initialize(cfg => {});
var result = Mapper.Map<Foo>(foo);
result.Bar.ShouldEqual(5);
result.Baz.ShouldEqual(6);
dynamic foo2 = Mapper.Map<MyDynamicObject>(result);
foo2.Bar.ShouldEqual(5);
foo2.Baz.ShouldEqual(6);
Del mismo modo se pueden asignar directamente de los diccionarios de objetos, AutoMapper se alineará las teclas con los nombres de propiedades.
más información https://github.com/AutoMapper/AutoMapper/wiki/Dynamic-and-ExpandoObject-Mapping
¿Es el tipo conocido en tiempo de compilación? – psubsee2003
¿Y qué esperas lograr con esto? Cuéntanos qué intentas lograr, en lugar de cómo esperas lograrlo. –
@JonSkeet: Deseo poder invocar una función desde el objeto. Actualmente 'obj.MyFunction();' no se compila, aunque sé que el objeto real sí tiene esa función. –