type try safe cast another c# object types casting typeof

c# - try - Cómo lanzar Objeto a su tipo real?



cast<> c# (7)

Casting al tipo real es fácil:

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

Si tengo:

void MyMethod(Object obj) { ... }

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


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


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.


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


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


Si su método MyFunction() está definido 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(); }


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