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
Pour récapituler, voici les informations d'OP à ce jour:
Cela devrait fonctionner,
static public string TestMethod(dynamic obj) {
return obj.GetType().GetProperty("Slab").GetValue(obj).ToString();
}
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;
}
}
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
.