A friend asked my by e-mail today about a problem he encountered with DotNet interop: how to access a property of an object, if the property name matches a reserved word in NAV. A simplest example is from the Microsoft.Dynamics.Nav.SMTP.SmtpMessage class that comes bundled with NAV 2013.
Consider this piece of code:
Mail := Mail.SmtpMessage; Mail.To := 'email@example.com';
If you try to compile this, it will fail. It’s simple: the To property name is invalid in the C/AL context, because it is a reserved word.
So, how do you fix it?
The answer is: reflection.
Reflection is a built-in functionality into the Framework Class Library that allows you to access meta-information about .NET types, and to dynamically manage that information. I know this is a lousy definition, and all my .NET black-belt ninja friends will now laugh in my face, but I wanted to keep the definition simple for my C/AL friends who don’t have extensive .NET experience.
So, in principle, this is what you must do if you have a situation such as this:
- Get the reference to the type of the object with a stubborn property.
- Use the type reference to get the PropertyInfo class representing the property you are trying to set.
- Use the PropertyInfo instance to dynamically set the value of the property on your object.
Let’s translate it to C/AL now. First, declare a variable of System.Type type from the mscorlib assembly. Then, write this code:
Mail := Mail.SmtpMessage; //Mail.To := 'firstname.lastname@example.org'; Type := GETDOTNETTYPE(Mail); Type.GetProperty('To').SetValue(Mail,'email@example.com'); MESSAGE('%1',Type.GetProperty('To').GetValue(Mail));
And that’s it. Try it and see if it works.
You can use the same principle with methods as well. I won’t write any code examples here, because I’ve already posted some examples that showcase this principle. Check the Try..Catch demo from my TechDays 2014 Black Belt session in this post.
I hope this helps. Please, let me know!