Sto scrivendo un semplice wrapper per "duck" un oggetto dynamic
contro un'interfaccia nota:Esiste un equivalente in C# a `reply_to? 'Di Ruby?
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);
}
}
Questo funziona bene se l'oggetto dynamic
può rispondere alla firma Bar
. Ma se non può fallire solo quando chiamo Bar
. Preferirei se potesse fallire più velocemente, cioè con la convalida dell'argomento sulla costruzione del wrapper DuckFoo
. Qualcosa di simile:
public DuckFoo(dynamic duck)
{
if(/* duck has no matching Bar method */)
throw new ArgumentException("duck", "Bad dynamic object");
this.duck = duck;
}
In Ruby c'è un metodo respond_to?
che può essere utilizzato per verificare se un oggetto "ha" un certo metodo. C'è un modo per testarlo con oggetti dinamici in C# 4?
(mi rendo conto che anche con questo controllare la chiamata bar potrebbe non riuscire più tardi perché la natura dinamica del duck
lo lascia smettere di rispondere a metodi più tardi.)
Cosa succede quando si esegue 'duck.GetType()' se 'duck' è dichiarato come' dynamic duck'? Che tipo restituisce? – dtb
Se l'oggetto dinamico è un oggetto .NET, si ottiene il Tipo dell'oggetto. –
Non penso che si possa fare una riflessione del genere su oggetti dinamici ... Forse se sono oggetti CLR regolari è possibile, ma non si può con oggetti provenienti da IronRuby, ad esempio ... –