Si j'ai:
void MyMethod(Object obj) { ... }
Comment puis-je transtyper obj
en son type actuel?
Si vous connaissez le type actuel, alors simplement:
SomeType typed = (SomeType)obj;
typed.MyFunction();
Si vous ne connaissez pas le type actuel, alors: pas vraiment, non. Vous devriez plutôt utiliser l'un des:
Par exemple:
// 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();
Je ne pense pas que vous puissiez (non sans réflexion), vous devriez également fournir un type à votre fonction:
void MyMethod(Object obj, Type t)
{
var convertedObject = Convert.ChangeType(obj, t);
...
}
UPD:
Cela peut fonctionner pour vous:
void MyMethod(Object obj)
{
if (obj is A)
{
A a = obj as A;
...
}
else if (obj is B)
{
B b = obj as B;
...
}
}
La conversion en caractères réels est facile:
void MyMethod(Object obj) {
ActualType actualyType = (ActualType)obj;
}
Dans mon cas, AutoMapper fonctionne bien.
AutoMapper peut mapper vers/depuis des objets dynamiques sans configuration explicite:
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 même, vous pouvez mapper directement des dictionnaires aux objets. AutoMapper alignera les clés avec les noms de propriétés.
plus d'infos https://github.com/AutoMapper/AutoMapper/wiki/Dynamic-and-ExpandoObject-Mapping
Transformez-le en son type réel si vous utilisez maintenant le type par exemple, il est orienté depuis la classe nommée abc . Vous pouvez appeler votre fonction de cette façon:
(abc)(obj)).MyFunction();
si vous ne connaissez pas la fonction, vous pouvez le faire différemment. Pas toujours facile. Mais vous pouvez le trouver d'une certaine manière par sa signature. Si tel est votre cas, vous devriez nous le faire savoir.
Si votre méthode MyFunction()
est définie uniquement dans une classe (et ses descendants), essayez
void MyMethod(Object obj)
{
var o = obj as MyClass;
if (o != null)
o.MyFunction();
}
Si vous avez un grand nombre de classes non liées définissant la fonction à appeler, vous devez définir une interface et faire en sorte que vos classes définissent cette interface:
interface IMyInterface
{
void MyFunction();
}
void MyMethod(Object obj)
{
var o = obj as IMyInterface;
if (o != null)
o.MyFunction();
}