Pregunta Cómo lanzar Objeto a su tipo real?


Si tengo:

void MyMethod(Object obj) {   ...   }

¿Cómo puedo lanzar obj a lo que es su tipo real?


76
2017-09-02 07:18


origen


Respuestas:


Si conoce el tipo real, simplemente:

SomeType typed = (SomeType)obj;
typed.MyFunction();

Si no conoce el tipo real, entonces: no realmente, no. En su lugar, tendría que usar uno de:

  • reflexión
  • implementando una interfaz bien 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();

132
2017-09-02 07:22



No creo que puedas (no sin reflexión), también debes proporcionar un tipo a tu 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;
        ...
    }
}

29
2017-09-02 07:25



Casting al tipo real es fácil:

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

2
2017-09-02 07:22



Si tu MyFunction() método se define solo en una clase (y sus descendientes), intente

void MyMethod(Object obj) 
{
    var o = obj as MyClass;
    if (o != null)
        o.MyFunction();
}

Si tiene un número grande en clases no relacionadas que definen la función a la que desea llamar, debe definir una interfaz y hacer que sus clases definan esa interfaz:

interface IMyInterface
{
    void MyFunction();
}

void MyMethod(Object obj) 
{
    var o = obj as IMyInterface;
    if (o != null)
        o.MyFunction();
}

0
2017-09-02 07:31



Equípelo en 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, puede hacerlo de otra manera. No es fácil siempre Pero puedes encontrarlo de alguna manera por su firma. Si este es tu caso, deberías avisarnos.


0
2017-09-02 08:11



En mi caso, AutoMapper funciona bien.

AutoMapper puede asignar a / desde 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);

De manera similar, puede mapear directamente desde los diccionarios a los objetos, AutoMapper alineará las teclas con los nombres de las propiedades.

más información https://github.com/AutoMapper/AutoMapper/wiki/Dynamic-and-ExpandoObject-Mapping


0
2018-05-10 06:37



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

-1
2017-09-02 07:26