web-dev-qa-db-fra.com

Objet anonyme C # comme paramètre ne fonctionnant pas

https://dotnetfiddle.net/446j lien à reproduire (échoué sur .net 4.7.2 pas sur .net core)


public class TEST { 

   static public void Main(string[] args)
    {
        var test = new { Text = "test", Slab = "slab"};
        Console.WriteLine(test.Text); //outputs test
        Console.WriteLine(TEST.TestMethod(test));  //outputs slab
    }

    static public string TestMethod(dynamic obj)
    {
        return obj.Slab;
    }
} 

l'accès à un objet anonyme dans la même fonction fonctionne correctement, mais lorsque j'essaie de le transmettre dans la fonction, je reçois une exception

Exception d'exécution (ligne 14): tentative par la méthode 'DynamicClass.CallSite.Target (System.Runtime.CompilerServices.Closure, System.Runtime.CompilerServices.CallSite, System.Object)' pour accéder au type '<> f__AnonymousType0`2' échoué.

Trace de la pile:

[System.TypeAccessException: la tentative par la méthode 'DynamicClass.CallSite.Target (System.Runtime.CompilerServices.Closure, System.Runtime.CompilerServices.CallSite, System.Object)' pour accéder au type '<> f__AnonymousType0`2' a échoué.] À CallSite.Target (Closure, CallSite, Object) à System.Dynamic.UpdateDelegates.UpdateAndExecute1 [T0, TRet] (CallSite site, T0 arg0) à TEST.TestMethod (Object obj): ligne 14 à TEST.Main (String [] args ): ligne 9


Modifier par @RandRandom:

La période de primes étant presque terminée, j'ai décidé de modifier cette question.

Jusqu'à présent, les réponses données ne parviennent pas à résoudre le problème en question et ne donnent que des moyens d'éviter l'erreur.

OP a clairement indiqué (dans les commentaires) qu'il était au courant des solutions de contournement et utilise actuellement une solution de contournement.

Ces questions demeurent

  1. POURQUOI l'erreur mentionnée se produit-elle lors de la configuration des OP et sur dotnetfiddle.net?
  2. Si l'erreur a été corrigée avec une mise à jour, qu'OP devrait-il mettre à jour?
  3. Vous avez résolu le problème dans un nouveau compilateur/Version .Net/Version Visual Studio?

Pour récapituler, voici les informations d'OP à ce jour:

  • VS 2017
  • .Net Framework 4.8
6
user3038144

Cela devrait fonctionner,

static public string TestMethod(dynamic obj) {
     return obj.GetType().GetProperty("Slab").GetValue(obj).ToString();
}
2
Berkay

Vous pouvez utiliser ExpandoObject pour le type dynamique de variables ou de paramètres dynamiques. https://docs.Microsoft.com/en-us/dotnet/api/system.dynamic.expandoobject?redirectedfrom=MSDN&view=netframework-4.8

public class TEST { 

   static public void Main(string[] args)
    {
        dynamic test = new ExpandoObject();
        test.Text = "test";
        test.Slab = "slab";
        Console.WriteLine(test.Text);
        Console.WriteLine(TEST.TestMethod(test));
    }

    static public string TestMethod(dynamic obj)
    {
        return obj.Slab;
    }
} 
0
GDI89

Il s'agit d'un problème avec .NET Fiddle. Le code fonctionne parfaitement avec la dernière Visual Studio 2017 mettre à jour (15.9.17) et .NET 4.7.2.

0
Kai Hartmann