2010-10-20 7 views
5

Ho un numero di metodi di accesso ai dati che accettano un parametro oggetto dinamico (ad es., Foo dinamico). Non riesco a utilizzare un'interfaccia per definire di digitare il parametro di input a causa del codice esistente. Sto impostando le proprietà nei metodi di accesso ai dati, ma l'utilizzo dinamico senza controllo per vedere se le proprietà/metodi esistono mi rende nervoso.Reflection è il modo migliore per determinare la presenza/assenza di proprietà/metodo su un oggetto dinamico?

Quindi sto cercando un modo per verificare le proprietà/metodi di esecuzione di un oggetto dinamico, ma preferirei non utilizzare la riflessione a causa dell'impatto sulle prestazioni. C'è un altro/modo consigliato per interrogare le proprietà/metodi di un oggetto dinamico?

Grazie, Erick

+0

Non si desidera utilizzare il riflesso a causa dell'impatto sulle prestazioni, ma sono felici di usare * dynamic *? –

+0

@Kirk: la dinamica effettivamente funziona sorprendentemente bene. È un po 'più veloce della riflessione per l'accesso ai membri ... –

+1

Pensi * che avranno un impatto sulle prestazioni o tu * conosci *? Le decisioni di progettazione sono fatte meglio sui fatti. – smirkingman

risposta

2

Reflection non funziona (come previsto) sui tipi dynamic. È necessario verificare IDynamicMetaObjectProvider, quindi utilizzare i relativi metodi per determinare se un membro è disponibile sul tipo.

Il problema è che è perfettamente accettabile per un tipo dynamic aggiungere nuovi membri in fase di runtime. Per un esempio, vedere ExpandoObject. Aggiunge solo i nuovi membri su operazioni di set, ma è possibile, altrettanto facilmente, fare un tipo dinamico che restituisce sempre un membro valido, non importa quello che è passato in esso, vale a dire:

dynamic myType = new DynamicFoo(); 
Console.WriteLine(myType.Foo); 
Console.WriteLine(myType.Bar); 
Console.WriteLine(myType.Baz); 

Questo può essere fatto da sovrascrivere la funzione di accesso e renderle sempre valide. In questo caso, la riflessione non avrebbe modo di dire cosa avrebbe funzionato qui ...

+0

Reed, questa è la risposta di cui avevo bisogno ma ho deciso di prendere l'approccio per provarlo e lasciare che l'eccezione venisse lanciata. Grazie! –

2

vorrei guardare a questo problema un po 'diverso. Se si stanno utilizzando gli oggetti con dynamic, è irrilevante se le proprietà siano accessibili tramite riflessione. Importa solo se sono accessibili tramite dynamic. Quindi, perché non usare solo le proprietà e catturare l'effetto che deriverebbe dalla loro assenza?

+0

+1 da parte mia: questo sarebbe il mio approccio. Basta usare l'oggetto e gestire le eccezioni come/se vengono. –

+0

@Reed, congratulazioni su 100K! – JaredPar

+0

Grazie! L'ho appena passato stamattina: D –

Problemi correlati