2012-09-02 23 views
71

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?

+2

¿Es el tipo conocido en tiempo de compilación? – psubsee2003

+1

¿Y qué esperas lograr con esto? Cuéntanos qué intentas lograr, en lugar de cómo esperas lograrlo. –

+0

@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. –

Respuesta

117

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:

  • reflexión
  • la implementación de una interfaz conocida
  • dinámica

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(); 
+0

¿Cuál es la sintaxis equivalente en Swift? – Rao

+1

No importa, se encuentra 'as' para la función de conversión de tipo y' tipo (de: Nombre de clase) 'para verificar el tipo de instancia. – Rao

0

La conversión a tipo real es fácil:

void MyMethod(Object obj) { 
    ActualType actualyType = (ActualType)obj; 
} 
+4

eso es muy divertido ... – Steve

+1

Esto no es lógico. En realidad no sabes el tipo real. ¿Cómo se supone que debes hacer eso? –

28

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; 
     ... 
    } 
} 
+1

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

0
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); 
} 
0

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(); 
} 
0

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.

0

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

Cuestiones relacionadas