获取动态变量的类型

时间:2014-12-30 06:42:08

标签: c# dynamic

我正在访问一个COM对象,一个方法返回一个动态变量。我没有返回动态变量的方法的实现,我需要将它强制转换为适当的类型,以便我可以在我的类中使用它。

所以我想知道是否有办法在运行时找到动态变量的基础类型。

动态变量是从COM函数返回的值,因此UnWrap不起作用,GetType()返回COMObject类型。

感谢

1 个答案:

答案 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并且只访问您知道的属性/方法。