我正在寫一個簡單的包裝,以「鴨」一個dynamic
對象與已知的接口:有沒有C#等價於Ruby的`respond_to?`?
interface IFoo { string Bar(int fred); }
class DuckFoo : IFoo
{
private readonly dynamic duck;
public DuckFoo(dynamic duck)
{
this.duck = duck;
}
public string Bar(int fred)
{
return duck.Bar(fred);
}
}
這工作得很好,如果dynamic
對象可以到Bar
簽名響應。但是,如果它不能僅當我打電話Bar
失敗。我更希望它能更快地失敗,即在構建DuckFoo
包裝器時進行參數驗證。是這樣的:
public DuckFoo(dynamic duck)
{
if(/* duck has no matching Bar method */)
throw new ArgumentException("duck", "Bad dynamic object");
this.duck = duck;
}
在Ruby有一個respond_to?
方法,其可以被用來測試是否有物體「有」一定的方法。有沒有辦法用C#4中的動態對象來測試它?
(我知道,即使有這個檢查欄調用可能失敗以後,因爲duck
的動態性質讓它停止響應方法以後。)
當您執行'duck.GetType()'時,會發生什麼?如果'duck'被聲明爲'dynamic duck'?它返回什麼類型? – dtb 2009-12-09 23:12:04
如果動態對象是一個.NET對象,您將獲得該對象的類型。 – 2009-12-09 23:12:07
我不認爲你可以在動態對象上做類似的反射...也許如果它們是常規的CLR對象,但你不能使用來自IronRuby的對象,例如... – 2009-12-09 23:12:34