web-dev-qa-db-fra.com

Comment convertir l'objet en son type actuel?

Si j'ai:

void MyMethod(Object obj) {   ...   }

Comment puis-je transtyper obj en son type actuel?

87
Paul Lassiter

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:

  • réflexion
  • implémenter une interface connue
  • dynamique

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();
144
Marc Gravell

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;
        ...
    }
}
34
Maksim Vi.

La conversion en caractères réels est facile:

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

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

0
Soren

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.

0
Masoud

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