背景
我正在使用C#在visual studio 2010上开发一个交易ActiveX API。由于它是一个ActiveX API,我只是添加了ActiveX作为我的参考。 api提供了三组内容:可用于调用API的方法,API为您更新信息的事件以及一些所谓的ActiveX COM对象。
问题
我在这里问了一个相关的问题:C# boolean int conversion issue最后,在查看异常被抛出之后,我知道它是关于强制转换的。以下是异常的描述:
*System.InvalidCastException was unhandled Message=Unable to cast object of type
InteractiveBrokersTradingSystem.Forex' to type 'TWSLib.IContract'.
*
这是我对Forex Class的定义:
namespace InteractiveBrokersTradingSystem
{
class Forex:TWSLib.IContract
{
public int conId { get; set; }
public string symbol { get; set; }
public string secType { get; set; }
public string expiry { get; set; }
public double strike { get; set; }
public string right { get; set; }
public string multiplier { get; set; }
public string exchange { get; set; }
public string primaryExchange { get; set; }
public string currency { get; set; }
public string localSymbol { get; set; }
public int includeExpired { get; set; }
public object comboLegs { get; set; }
public object underComp { get; set; }
public string comboLegsDescrip { get;set; }
public string secIdType { get; set; }
public string secId { get; set; }
public Forex(string preCurrency,string baseCurrency)
{
//conId = 0;
//symbol = preCurrency;
//secType = "CASH";
//expiry = null;
//strike = double.Parse("0");
//right = null;
//multiplier = null;
//exchange = "IDEALPRO";
//primaryExchange = "IDEALPRO";
//currency = baseCurrency;
//localSymbol = null;
//includeExpired = 0;
// comboLegs = null;
//underComp = null;
//comboLegsDescrip = null;
//secType = null;
//secId = null;
}
}
}
你可以看到我没有为类的属性赋值,并且无论我指定或不指定什么类型的值或者为null,异常总是相同的。
在下面作为图像的api的描述中,我们可以看到一些属性,其中()类似于strike()为doulble,而另一些属性则没有(),如secType为字符串;有人告诉我这可能有问题。请给我任何与此COM投射问题相关的提示:
a busy cat http://i.minus.com/iNIuzObDnHLJE.jpg
答案 0 :(得分:1)
你能发布一些实际失败的代码吗?
我认为正在发生的事情是你正在尝试将COM对象转换为普通的.NET类型而这是行不通的,因为COM对象需要通过Runtime Callable Wrapper显式地映射到.NET类型或通过手动映射。
我的一个建议是跳过显式转换并使用.NET 4.0中的动态类型来访问COM对象的属性,然后将其映射到您需要它的任何属性/对象。这样,您就能够准确地看到对象的哪个部分不想映射。