プロパティやメソッド名を含む文字列のリストを作成し、それらのプロパティやメソッドをCOMオブジェクトに適用しようとするレガシーコードに取り組んでいます。COMオブジェクトのプロパティまたはメソッドが存在することは保証されておらず、どちらかわからないプロパティまたはメソッドのいずれかである可能性があります。
現時点では、プロパティまたはメソッドが存在しない場合、COM例外としてキャッチされます。これにより、パフォーマンスが低下します。例外を生成せずにプロパティまたはメソッドがCOMオブジェクトに存在するかどうかを確認する方法を見つけて、適用する前にその存在を確認できるようにしようとしています。
GetTypeを使用すると、タイプSystem.com_objectが返されます。System.com_objectでGetPropertyを使用することは機能しません。これは、派生元の型ではなく、正確な実行時型であるためです。代わりに、メンバーが存在しない場合に例外を作成するInvokeMemberを実行する必要があります。誰かがこれを行うためのより良い方法を持っていますか?
現在、 .NET3.5で作業しています。現時点では.NET4への移行はオプションではありませんが、新しい言語機能が問題を解決するためのより良い方法を提供するのであれば、.NET4のソリューションに興味があります。
public static bool CheckIfComPropertyOrMethodExists<T1>(T1 objectToCheck, string propertyOrMethodName)
{
if (CheckIfComPropertyExists(objectToCheck, propertyOrMethodName) == false & CheckIfComMethodExists(objectToCheck, propertyOrMethodName) == false) {
return false;
}
{
return true;
}
}
public static bool CheckIfComPropertyExists<T1>(T1 objectToCheck, string propertyName)
{
return objectToCheck.GetType().InvokeMember(propertyName, BindingFlags.GetProperty, null, objectToCheck, null) != null;
}
public static bool CheckIfComMethodExists<T1>(T1 objectToCheck, string methodName)
{
return objectToCheck.GetType().GetMethod(methodName, BindingFlags.Public | BindingFlags.Instance) != null;
}
これまでに役立つ記事
オブジェクトに特定のメソッド/プロパティがあるかどうかを確認するにはどうすればよいですか?
C#からIDispatchCOMインターフェイスのメンバーを呼び出す
http://msdn.microsoft.com/en-us/library/aa909091.aspx
http://msdn.microsoft.com/en-us/magazine/dd347981.aspx
http://blogs.msdn.com/b/lucian/archive/2008/10/06/reflection-on-com-objects.aspx