Et qu'espérez-vous en faire? Veuillez nous dire ce que vous essayez d'atteindre, plutôt que comment vous comptez y parvenir.
Jon Skeet
@JonSkeet: Je veux pouvoir appeler une fonction à partir de l'objet. Actuellement, obj.MyFunction();ne compile pas, même si je sais que l'objet réel a cette fonction.
Paul Lassiter le
@ psubsee2003: non, ce n'est pas le cas, car c'est une référence d'objet passée via l'interopérabilité.
Paul Lassiter
3
@PaulLassiter: Si vous ne connaissez pas le type, qu'est-ce qui déclare la MyFunctionméthode?
C'est vraiment une réponse inutile, qui ne mérite pas de votes positifs. La réflexion d'un objet de type objet ne donnera pas le "type réel" de l'objet, comme demandé par OP. De plus, votre logique MyMethod est imparfaite car obj peut être de type A et il peut également être de type B. Votre logique ne fournit pas le "type réel" (comme OP demandé) - il fournit un type compatible, et pas nécessairement le type souhaité à cela.
Jazimov
utilisez obj.GetType (). Cela retournera certainement son type réel.
JSON
3
Que diriez-vous de JsonConvert.DeserializeObject (object.ToString ());
Ce n’est pas une réponse satisfaisante. La question d'OP n'a rien à voir avec Json ou la sérialisation.
@ user12637955 c'est en fait une réponse fonctionnelle, mais elle est plus complexe, en raison de la boxe et du déballage, c'est-à-dire object -> ToString () -> to concret type. Pour être plus précis, cela devrait ressembler à ceci:var myType = JsonConvert.DeserializeObject<MyType>(object.ToString());
Coke
1
Dans mon cas, AutoMapper fonctionne bien.
AutoMapper peut mapper vers / depuis des objets dynamiques sans aucune configuration explicite:
Cette méthode n'est peut-être pas la plus efficace, mais elle est simple et fait le travail.
Il effectue deux opérations: d'abord il appelle .ToString () qui est fondamentalement une sérialisation, puis la désérialisation à l'aide de Newtonsoft nuget (que vous devez installer).
public T Format<T>(Object obj)=>JsonConvert.DeserializeObject<T>(obj.ToString());
Vous devez décrire brièvement votre réponse pour les futurs lecteurs.
Suraj Kumar le
0
Si votre MyFunction()méthode est définie uniquement dans une classe (et ses descendants), essayez
voidMyMethod(Object obj){var o = obj asMyClass;if(o !=null)
o.MyFunction();}
Si vous avez un grand nombre de classes non liées définissant la fonction que vous souhaitez appeler, vous devez définir une interface et faire en sorte que vos classes définissent cette interface:
interfaceIMyInterface{voidMyFunction();}voidMyMethod(Object obj){var o = obj asIMyInterface;if(o !=null)
o.MyFunction();}
Transformez-le en son type réel si vous maintenant le type, par exemple, il est orienté à partir de la classe nommée abc. Vous pouvez appeler votre fonction de cette manière:
(abc)(obj)).MyFunction();
si vous ne connaissez pas la fonction, cela peut être fait d'une manière différente. Pas toujours facile. Mais vous pouvez le trouver d'une certaine manière par sa signature. Si tel est votre cas, vous devez nous le faire savoir.
C'est illogique. En fait, vous ne connaissez pas le type réel. Comment es-tu censé faire ça?
Allen Linatoc
-2
Implement an interface to call your function in your methodinterfaceIMyInterface{voidMyinterfaceMethod();}IMyInterfaceMyObj= obj asIMyInterface;if(MyObj!=null){MyMethod(IMyInterfaceMyObj);}
obj.MyFunction();
ne compile pas, même si je sais que l'objet réel a cette fonction.MyFunction
méthode?Réponses:
Si vous connaissez le type réel, alors juste:
Si vous ne connaissez pas le type réel, alors: pas vraiment, non. Vous devrez à la place utiliser l'un des éléments suivants:
Par exemple:
la source
as
pour le typage ettype(of: ClassName)
fonction pour vérifier le type d'instance.Je ne pense pas que vous puissiez (non sans réflexion), vous devriez également fournir un type à votre fonction:
UPD :
Cela peut fonctionner pour vous:
la source
Que diriez-vous de JsonConvert.DeserializeObject (object.ToString ());
la source
var myType = JsonConvert.DeserializeObject<MyType>(object.ToString());
Dans mon cas, AutoMapper fonctionne bien.
AutoMapper peut mapper vers / depuis des objets dynamiques sans aucune configuration explicite:
De même, vous pouvez mapper directement des dictionnaires aux objets, AutoMapper alignera les clés avec les noms de propriété.
plus d'infos https://github.com/AutoMapper/AutoMapper/wiki/Dynamic-and-ExpandoObject-Mapping
la source
Cette méthode n'est peut-être pas la plus efficace, mais elle est simple et fait le travail.
Il effectue deux opérations: d'abord il appelle .ToString () qui est fondamentalement une sérialisation, puis la désérialisation à l'aide de Newtonsoft nuget (que vous devez installer).
la source
Si votre
MyFunction()
méthode est définie uniquement dans une classe (et ses descendants), essayezSi vous avez un grand nombre de classes non liées définissant la fonction que vous souhaitez appeler, vous devez définir une interface et faire en sorte que vos classes définissent cette interface:
la source
Transformez-le en son type réel si vous maintenant le type, par exemple, il est orienté à partir de la classe nommée abc. Vous pouvez appeler votre fonction de cette manière:
si vous ne connaissez pas la fonction, cela peut être fait d'une manière différente. Pas toujours facile. Mais vous pouvez le trouver d'une certaine manière par sa signature. Si tel est votre cas, vous devez nous le faire savoir.
la source
La diffusion au type réel est facile:
la source
la source