我在看問題Use 'dynamic' throw a RuntimeBinderException。我面臨着類似的問題:爲什麼我必須手動創建ExpandoObject才能正確使用動態關鍵字?
基本上,我想創建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屬性。
調用者和被調用者位於單獨的程序集中。爲什麼會發生這個問題?
(該解決方案已被證明在同樣的問題:Manually create an 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());
}
}
[編輯,以更清楚的是出現我的問題時,「明顯「位置屬性已設置。我知道,如果財產從來沒有被定義在首位,必須提出例外。]
是的,我知道了「當前位置」屬性必須存在。正如所說的那樣,只要具有args,它就「確實存在」。觀察窗口中的ToString()向我顯示「Position = 4,Size = 6」,但代碼仍然拋出異常。 – Cornelius
@ClearsTheScreen:它不應該那樣做,它當然不會爲我做。請嘗試我發佈的代碼 - 是否拋出?如果沒有,請嘗試通過將其更改爲代碼來進行修改 - 一次更改一次。 –
我以爲我那樣做了,但我顯然不應該在晚上調試。謝謝你在右側的微調。 +1 :) – Cornelius