如何控制动态"不抛出异常

时间:2015-04-21 16:12:25

标签: c# dynamic binding com

我有一段代码试图从这样的对象中获取BarID:

try
{

     dynamic dynItem = (dynamic)foo;
     string barId = dynItem.BarID;
}
catch (RuntimeBinderException)
{
       // Deliberately swallow any errors due to late-binding
}

请注意,foo是一个COM对象,有很多COM接口可以公开它,我不能简单地尝试转换为每个接口。

问题是动态实现抛出RuntimeBinderException导致Visual Studio因“第一次机会异常”而中断,我需要避免这种情况。

任何想法是否可以访问某些API(Microsoft.Dynamic?)以查看调用BarId而不抛出异常,就像动态可能在幕后一样?

注意:

    由于COM

  • 反射将无效

  • 我可以使用COM IDispatch接口,但这个级别太低了(我将不得不花费接下来的两天时间编写单元测试......)

1 个答案:

答案 0 :(得分:1)

我不相信你可以在没有抛出异常的情况下测试它。我不认为在你无法看到的封面下发生任何魔法。您可以尝试的一件事是让所有对象都实现IHaveBarID接口。

然后你可以写:

IHaveBarID dynItem = foo as IHaveBarID;
if (dynItem != null)
    string  barID = dynItem.BarID;

否则,您将需要使用IDispatch或告诉VS不要破坏该特定类型的异常。