[解決済み] C# 'dynamic' は別のアセンブリで宣言された匿名型からプロパティにアクセスできない
2023-04-21 08:25:59
質問
以下のコードは、クラスがある限り、うまく動作します。
ClassSameAssembly
と同じアセンブリに
Program
.
しかし、クラス
ClassSameAssembly
を別のアセンブリに移動すると
RuntimeBinderException
(下記参照)がスローされます。
これを解決することは可能でしょうか?
using System;
namespace ConsoleApplication2
{
public static class ClassSameAssembly
{
public static dynamic GetValues()
{
return new
{
Name = "Michael", Age = 20
};
}
}
internal class Program
{
private static void Main(string[] args)
{
var d = ClassSameAssembly.GetValues();
Console.WriteLine("{0} is {1} years old", d.Name, d.Age);
}
}
}
Microsoft.CSharp.RuntimeBinder.RuntimeBinderException
:
'object' に 'Name' の定義がありません。
at CallSite.Target(Closure , CallSite , Object )
at System.Dynamic.UpdateDelegates.UpdateAndExecute1[T0,TRet](CallSite site, T0 arg0)
at ConsoleApplication2.Program.Main(String[] args) in C:\temp\Projects\ConsoleApplication2\ConsoleApplication2\Program.cs:line 23
どのように解決するのですか?
問題は、匿名型が
internal
として生成されるため、バインダがそれをそのように実際に "know" していないことです。
代わりにExpandoObjectを使ってみてください。
public static dynamic GetValues()
{
dynamic expando = new ExpandoObject();
expando.Name = "Michael";
expando.Age = 20;
return expando;
}
多少醜いとは思いますが、今のところこれがベストです...。オブジェクトのイニシャライザを使うこともできないと思います。
ExpandoObject
と強く型付けされているため、コンパイラは "Name" と "Age" をどうすればいいかわからないのです。あなたは
は
はこれを行うことができます。
dynamic expando = new ExpandoObject()
{
{ "Name", "Michael" },
{ "Age", 20 }
};
return expando;
が、これではあまり良くない...。
あなたは 潜在的に は、リフレクションによって無名型を同じ内容を持つエキスパンドに変換する拡張メソッドを書くことができます。そうすれば、書くことができる。
return new { Name = "Michael", Age = 20 }.ToExpando();
それはかなりひどいですけど :(
関連
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン