我在看问题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>
}
然而,在天真的方法中,我被RuntimeBinderException
抛出,声明'object' does not contain a definition for 'Position'
,即使在调试和悬停在 _args 变量上时,它显然确实有一个 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 属性时出现的。我知道如果一开始就没有定义该属性,则必须引发异常。]