vb.net - Dynamic method calling in VB without reflection -


i want format numeric type using method call so:

option infer on option strict off imports system.runtime.compilerservices  namespace gpr     module gprextensions         <extension()>         public function togprformattedstring(value) string             ' use vb's dynamic dispatch assume value numeric             dim d double = cdbl(value)             dim s = d.tostring("n3")             dim dynamicvalue = value.tostring("n3")             return dynamicvalue         end function     end module end namespace 

now, various discussions around web (vb.net equivalent c# 'dynamic' option strict on, dynamic keyword equivalent in vb.net?), think code work when passed numeric type (double, decimal, int, etc). doesn't, can see in screenshot:

exception showing dynamic method call failing

i can explicitly convert argument double , .tostring("n3") works, calling on supposedly-dynamic value argument fails.

however, can in c# following code (using linqpad). (note, compiler won't let use dynamic parameter in extension method, maybe part of problem.)

void main() {     console.writeline (1.togprformattedstring()); }  internal static class gprextensions {     public static string togprformattedstring(this object o)     {         // use vb's dynamic dispatch assume value numeric         var value = o dynamic;         double d = convert.todouble(value);         var s = d.tostring("n3").dump("double tostring");         var dynamicvalue = value.tostring("n3");         return dynamicvalue;     } } 

dynamic method invocation in c# works

so gives? there way in vb call method dynamically on argument function without using reflection?

to explicitly answer "is there way in vb call method dynamically on argument function without using reflection?":

edit: i've reviewed il disassembly (via linqpad) , compared code of callbyname (via reflector) , using callbyname uses same amount of reflection normal, option strict off late binding.

so, complete answer is: can option strict off object references, except method you're trying exists on object itself, can use callbyname same effect (and, in fact, doesn't need option strict off).

dim dynamicvalue = callbyname(value, "tostring", calltype.method, "n3") 

nb not equivalent late binding call, must cater possibility "method" a(n indexed) property, calls equivalent of:

dim dynamicvalue = callbyname(value, "tostring", calltype.get, "n3") 

for other methods, double.compareto.


details

your problem here object.tostring() exists , code not attempting dynamic dispatch, rather array index lookup on default string.chars property of string result value.tostring() call.

you can confirm happening @ compile time trying value.tostring(1,2), prefer attempt runtime lookup 2 parameter tostring, in fact fails with

too many arguments 'public readonly default property chars(index integer) char'

at compile time.

you can confirm other non-shared object methods called directly callvirt, relying upon overrides available, not dynamic dispatch calls microsoft.visualbasic.compilerservices.newlatebinding namespace, if review compiled code in il.


Comments

Popular posts from this blog

javascript - DIV "hiding" when changing dropdown value -

Does Firefox offer AppleScript support to get URL of windows? -

android - How to install packaged app on Firefox for mobile? -