【问题标题】:Getting the type of Dynamic variable [duplicate]获取动态变量的类型[重复]
【发布时间】:2015-01-01 14:07:53
【问题描述】:

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

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

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

谢谢

【问题讨论】:

  • 为什么需要投射它?只需将您的方法的参数设置为您通常将其转换为的类型并将其传入即可。运行时将负责其余的工作。
  • 帮助您发现对象类型的一个好方法是使用您的调试器。在方法调用后的行上放置一个断点,并使用 Watch 窗口检查返回的对象。
  • 换一种说法,假设您拥有的dynamic 引用已经是您需要的类型,并相应地编写您的代码。如果您向我们展示一些代码,将更容易说明我的意思。

标签: c# dynamic


【解决方案1】:

如果返回的对象可以是多种类型之一,那么您最好继续将其用作dynamic,并且只尝试访问您知道将存在的方法和属性(I' d 期望 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 方法可能不会返回具体的类型,它可能会返回一个匿名对象,在这种情况下,您无法进行强制转换,因此您必须继续将其用作 @987654326 @ 并且只访问你知道存在的属性/方法。

【讨论】:

  • 通过watch访问或获取类型时,变量的类型为COMObject。所以我不知道将变量转换为哪种类型。另外我无法检查 COM 方法的实现,所以找不到返回对象的类型。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-13
  • 1970-01-01
  • 2014-06-14
  • 2021-12-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多