

‘is’ and ‘as’ operators with .NET types
source link: http://dev.goshoom.net/2020/05/is-and-as-operators-with-net-objects/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

‘is’ and ‘as’ operators with .NET types
I recently ran into an unfortunate limitation of .NET Interop from X++ (in D365FO).
I wanted to check if an X++ object is of a given type, nevertheless the type used for the variable declaration was a .NET interface. Here is an example:
using Microsoft.Dynamics.ApplicationSuite.FinancialManagement.Currency.Framework; void demo(IExchangeRateProvider _provider) { if (_provider is ExchangeRateProviderCBOE) {} }
Exchange rate providers are X++ classing implementing IExchangeRateProvider interface and I wanted to check if the object I received was a particular provider (namely ExchangeRateProviderCBOE class or its child). Unfortunately this ended up with a compilation error:
The operand on the left side of the ‘is’ or ‘as’ operator must be a table, class, or form.
As I tested, neither managed interfaces nor managed classes (such as System.Object) can be used on the left side of ‘is’ and ‘as’ operators.
I solved the problem by using Type.IsAssignableFrom() method. Simply using the ‘is’ operator would be nicer, but this does the job too.
void demo(IExchangeRateProvider _provider) { System.Object providerObj = _provider; if (providerObj.GetType().IsAssignableFrom(new ExchangeRateProviderCBOE().GetType())) {} }
Note that the problem is only with the left side of the operators, e.g. when you want to check whether a managed type is this or that. Using the ‘is’ operator to check if an instance of an X++ class implements a managed interface works without problems.
Object obj = new ExchangeRateProviderCBOE(); if (obj is IExchangeRateProvider) {}
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK