我正在访问一个COM对象,一个方法返回一个动态变量。我没有返回动态变量的方法的实现,我需要将它强制转换为适当的类型,以便我可以在我的类中使用它。
所以我想知道是否有办法在运行时找到动态变量的基础类型。
动态变量是从COM函数返回的值,因此UnWrap不起作用,GetType()返回COMObject类型。
感谢
答案 0 :(得分:0)
如果要返回的对象可以是众多类型中的一种,那么您最好继续将其用作dynamic
并且只尝试访问您知道的方法和属性存在(我期望COM方法有一些指示如何使用它返回的动态)。
var canBeLiterallyAnything = ComMethod();
canbeLiterallyAnything.MethodDocsSayExists();
var propVal = canBeLiterallyAnything.SomeProperty;
当然,如果所有可能的类型都实现了相同的接口,则可以转换为该接口。
var typeSafeReference = (ISharedInterface)canBeLiterallyAnything;
如果你知道COM方法返回一个特定的类型,但只是不知道该类型是什么,那么为了调查你可以调用GetType()并将其写入控制台或设置断点并检查它。这将允许您更新代码以包含对该类型的强制转换(这将最小化使用dynamic
的影响,但如果可以返回其他类型,还会引入错误强制转换的风险)。
var type = canBeLiterallyAnything.GetType();
// e.g. If the above returns a Type of 'SpecificType', then you can update code to
var typeSafeReference = (SpecificType)canBeLiterallyAnything;
应该注意的是,COM方法可能不会返回一个具体的Type,它可能会返回一个匿名对象,在这种情况下你没有可以执行的转换,所以你必须继续使用它作为一个dynamic
并且只访问您知道的属性/方法。