Come verificare se esiste una proprietà o un metodo COM senza generare un’eccezione?

Sto lavorando su un codice legacy che crea un elenco di stringhe contenenti proprietà e / o nomi di metodi e quindi tenta di applicare tali proprietà o metodi a un object COM. La proprietà o il metodo per l’object COM non è garantito per esistere e potrebbe essere una proprietà o un metodo che non conosco quale.

Al momento, se una proprietà o un metodo non esiste, viene catturato come eccezione COM. Ciò si traduce in scarse prestazioni. Sto cercando di trovare un modo per verificare se una proprietà o un metodo esiste in un object COM senza generare un’eccezione in modo che possa verificare la sua esistenza prima di tentare di applicarlo.

L’utilizzo di GetType restituisce il tipo System.com_object. L’utilizzo di GetProperty su System.com_object non funziona in quanto si tratta del tipo di runtime esatto e non del tipo da cui deriva. Invece devo InvokeMember che crea un’eccezione se il membro non esiste. Qualcuno ha un modo migliore per farlo?

Sto lavorando in .NET 3.5 al momento. La migrazione a .NET 4 al momento non è un’opzione, ma sarei comunque interessato alle soluzioni in .NET 4 se le nuove funzionalità del linguaggio offrono un modo migliore per risolvere il problema.

public static bool CheckIfComPropertyOrMethodExists(T1 objectToCheck, string propertyOrMethodName) { if (CheckIfComPropertyExists(objectToCheck, propertyOrMethodName) == false & CheckIfComMethodExists(objectToCheck, propertyOrMethodName) == false) { return false; } { return true; } } public static bool CheckIfComPropertyExists(T1 objectToCheck, string propertyName) { return objectToCheck.GetType().InvokeMember(propertyName, BindingFlags.GetProperty, null, objectToCheck, null) != null; } public static bool CheckIfComMethodExists(T1 objectToCheck, string methodName) { return objectToCheck.GetType().GetMethod(methodName, BindingFlags.Public | BindingFlags.Instance) != null; } 

Articoli utili finora

Come verificare se un object ha determinati metodi / proprietà?

Chiamare un membro dell’interfaccia COM IDispatch da C #

http://msdn.microsoft.com/en-us/library/aa909091.aspx

Implementazione di IDispatch in c #

http://msdn.microsoft.com/en-us/magazine/dd347981.aspx

http://blogs.msdn.com/b/lucian/archive/2008/10/06/reflection-on-com-objects.aspx

Molto probabilmente la class COM implementa anche l’interfaccia IDispatch. È quindi ansible utilizzare i suoi GetIDsOfNames per verificare se esiste un membro nella class.

Qui qualcuno lo chiama da C #:

Chiamare un membro dell’interfaccia COM IDispatch da C #