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は、彼が回避策を認識しており、現在回避策を使用していることを(コメントで)明確に述べました。
それらの質問はまだ残っています
ここで要約すると、これまでのOPの情報です。
これはうまくいくはずです
static public string TestMethod(dynamic obj) {
return obj.GetType().GetProperty("Slab").GetValue(obj).ToString();
}
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;
}
}
これは.NET Fiddle
の問題です。コードは、最新のVisual Studio 2017
アップデート(15.9.17
)および.NET 4.7.2
で完全に正常に動作しています。