web-dev-qa-db-ja.com

パラメータとしてのC#匿名オブジェクトが機能しない

https://dotnetfiddle.net/446j 複製するリンク(.netコアではなく.net 4.7.2で失敗)


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;
    }
} 

同じ関数内の匿名オブジェクトへのアクセスは正常に機能していますが、それを関数に渡そうとすると例外が発生します

実行時例外(14行目):メソッド 'DynamicClass.CallSite.Target(System.Runtime.CompilerServices.Closure、System.Runtime.CompilerServices.CallSite、System.Object)'によるタイプ '<> f__AnonymousType0`2'へのアクセスの試行失敗した。

スタックトレース:

[System.TypeAccessException:メソッド 'DynamicClass.CallSite.Target(System.Runtime.CompilerServices.Closure、System.Runtime.CompilerServices.CallSite、System.Object)'によるタイプ '<> f__AnonymousType0`2'へのアクセスの試みに失敗しました。 System.Dynamic.UpdateDelegates.UpdateAndExecute1 [T0、TRet](CallSite site、T0 arg0)at TEST.TestMethod(Object obj)のCallSite.Target(Closure、CallSite、Object):行14のTEST.Main(String [] args ):行9


@ RandRandomで編集:

バウンティ期間がほぼ終了したため、この質問を編集することにしました。

これまでに与えられた答えはすべて、実際の問題に実際に答えることができず、エラーを回避する方法を提供するだけです。

OPは、彼が回避策を認識しており、現在回避策を使用していることを(コメントで)明確に述べました。

それらの質問はまだ残っています

  1. 上記のエラーがOPセットアップとdotnetfiddle.netで発生するのはなぜですか?
  2. アップデートでエラーが修正された場合、OPは何をアップデートする必要がありますか?
  3. 新しいコンパイラー/ .Netバージョン/ Visual Studioバージョンで問題が修正されましたか?

ここで要約すると、これまでのOPの情報です。

  • VS 2017
  • .Net Framework 4.8
6
user3038144

これはうまくいくはずです

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

ExpandoObjectは、動的タイプの変数または動的パラメーターに使用できます。 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

これは.NET Fiddleの問題です。コードは、最新のVisual Studio 2017アップデート(15.9.17)および.NET 4.7.2で完全に正常に動作しています。

0
Kai Hartmann