Use 'dynamic' throw a RuntimeBinderExceptionという質問を見ていました。私は同様の問題に直面しています:
基本的に、動的引数を使用する ASP.NET MVC で "HTML ヘルパー" を作成したいと考えています。これは、多くの既存のヘルパーの htmlArguments パラメーターに似ています (詳細は以下のコード)。
public BootstrapCell(Action<string> emitContentAction, dynamic args)
意見:
@using (grid.Cell(ViewContext.Writer.Write, new {Position = 4}))
{
<p>zomg!</p>
}
ただし、素朴なアプローチでは、_args変数をデバッグしてホバリングすると、明らかにPositionプロパティがあるにもかかわらずRuntimeBinderException
、それを宣言して投げ出されます。'object' does not contain a definition for 'Position'
呼び出し元と呼び出し先は別のアセンブリにあります。なぜその問題が起こっているのですか?
(その解決策は、同じ質問に示されています:手動で ExpandoObject を作成して引数を保持します。)
実装:
public class Cell
{
private readonly string _tagName;
private dynamic _args;
private Action<string> EmitContentAction;
public BootstrapCell(Action<string> emitContentAction, dynamic args) : DisposableBaseClass
{
_args = args;
EmitContentAction = emitContentAction;
OnContextEnter();
}
protected void OnContextEnter()
{
var sb = new StringBuilder("<");
sb.Append(_tagName);
if (_args.Position > 0)
{
sb.Append(" class=\"offset");
sb.Append(args.Position);
sb.Append("\"");
}
sb.Append(">");
EmitContentAction(sb.ToString());
}
}
[「明らかに」Positionプロパティが設定されているときに問題が発生することを明確にするために編集。プロパティが最初から定義されていない場合は、例外を発生させる必要があることを認識しています。]