<html><head><meta http-equiv="Content-Type" content="text/html; charset=us-ascii"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;" class=""><br class=""><div><blockquote type="cite" class=""><div class="">On Dec 5, 2017, at 5:47 AM, Benjamin G &lt;<a href="mailto:benjamin.garrigues@gmail.com" class="">benjamin.garrigues@gmail.com</a>&gt; wrote:</div><br class="Apple-interchange-newline"><div class=""><span style="font-family: SourceCodePro-Regular; font-size: 14px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">About C#, in which i did program a few years ago (but before dynamic was in the language), it already had powerful metaprogramming and introspection capabilities, as well as very convenient&nbsp; generics and interfaces ( easier to work with than what swift offers today, but that was a long time ago so my memory may be wrong). So, in some way, the potential for abusing dynamic or "stringly typed" programming was a lot lower.</span></div></blockquote></div><br class=""><div class="">I find this perspective interesting because one of the articles I linked to on `dynamic` explicitly pointed out how it made some code far clearer than using reflection.</div><div class=""><br class=""></div><div class=""><a href="https://www.codeproject.com/Articles/69407/The-Dynamic-Keyword-in-C" class="">https://www.codeproject.com/Articles/69407/The-Dynamic-Keyword-in-C</a></div><div class=""><br class=""></div><div class="">The example code using reflection:</div><div class=""><pre lang="cs" id="pre430552" processed="true" class="notranslate" style="background-color: rgb(251, 237, 187); padding: 6px; font-stretch: normal; font-size: 9pt; line-height: normal; font-family: Consolas, &quot;Courier New&quot;, Courier, mono; white-space: pre-wrap; border: 1px solid rgb(251, 237, 187); tab-size: 4; overflow: auto; word-wrap: break-word; word-break: break-word; margin-top: 0px;"><span class="code-keyword" style="margin: 0px; padding: 0px; border: 0px; color: rgb(0, 0, 255);">public</span> <span class="code-keyword" style="margin: 0px; padding: 0px; border: 0px; color: rgb(0, 0, 255);">class</span> ReflectiveTester : Tester
{

    <span class="code-keyword" style="margin: 0px; padding: 0px; border: 0px; color: rgb(0, 0, 255);">static</span> <span class="code-keyword" style="margin: 0px; padding: 0px; border: 0px; color: rgb(0, 0, 255);">void</span> WritePropertyReflectively(<span class="code-keyword" style="margin: 0px; padding: 0px; border: 0px; color: rgb(0, 0, 255);">object</span> instance, <span class="code-keyword" style="margin: 0px; padding: 0px; border: 0px; color: rgb(0, 0, 255);">string</span> propertyName)
    {
        Type type = instance.GetType();
        <em style="margin: 0px; padding: 0px; border: 0px;" class="">PropertyInfo propertyInfo = type.GetProperty(propertyName);
        <span class="code-keyword" style="margin: 0px; padding: 0px; border: 0px; color: rgb(0, 0, 255);">if</span> (propertyInfo == <span class="code-keyword" style="margin: 0px; padding: 0px; border: 0px; color: rgb(0, 0, 255);">null</span>)
            Console.WriteLine(<span class="code-string" style="margin: 0px; padding: 0px; border: 0px; color: rgb(128, 0, 128);">"</span><span class="code-string" style="margin: 0px; padding: 0px; border: 0px; color: rgb(128, 0, 128);">Property \"{0}\" not found, propertyInfo "</span> + 
                              <span class="code-string" style="margin: 0px; padding: 0px; border: 0px; color: rgb(128, 0, 128);">"</span><span class="code-string" style="margin: 0px; padding: 0px; border: 0px; color: rgb(128, 0, 128);">is null\r\npropertyInfo.GetValue(...) will result "</span> + 
                              <span class="code-string" style="margin: 0px; padding: 0px; border: 0px; color: rgb(128, 0, 128);">"</span><span class="code-string" style="margin: 0px; padding: 0px; border: 0px; color: rgb(128, 0, 128);">in a NullReferenceException"</span>, propertyName);</em>
        <span class="code-keyword" style="margin: 0px; padding: 0px; border: 0px; color: rgb(0, 0, 255);">else</span>
            Console.WriteLine(propertyInfo.GetValue(instance, <span class="code-keyword" style="margin: 0px; padding: 0px; border: 0px; color: rgb(0, 0, 255);">null</span>));
    }

    <span class="code-keyword" style="margin: 0px; padding: 0px; border: 0px; color: rgb(0, 0, 255);">static</span> <span class="code-keyword" style="margin: 0px; padding: 0px; border: 0px; color: rgb(0, 0, 255);">void</span> CallMethodReflectively(<span class="code-keyword" style="margin: 0px; padding: 0px; border: 0px; color: rgb(0, 0, 255);">object</span> instance, <span class="code-keyword" style="margin: 0px; padding: 0px; border: 0px; color: rgb(0, 0, 255);">string</span> methodName)
    {
        Type type = instance.GetType();
        MethodInfo methodInfo = type.GetMethod(methodName);
        <em style="margin: 0px; padding: 0px; border: 0px;" class=""><span class="code-keyword" style="margin: 0px; padding: 0px; border: 0px; color: rgb(0, 0, 255);">if</span> (methodInfo == <span class="code-keyword" style="margin: 0px; padding: 0px; border: 0px; color: rgb(0, 0, 255);">null</span>)
            Console.WriteLine(<span class="code-string" style="margin: 0px; padding: 0px; border: 0px; color: rgb(128, 0, 128);">"</span><span class="code-string" style="margin: 0px; padding: 0px; border: 0px; color: rgb(128, 0, 128);">Method \"{0}\" not found, "</span> + 
                              <span class="code-string" style="margin: 0px; padding: 0px; border: 0px; color: rgb(128, 0, 128);">"</span><span class="code-string" style="margin: 0px; padding: 0px; border: 0px; color: rgb(128, 0, 128);">methodInfo set to null\r\nmethodInfo.Invoke(...) "</span> + 
                              <span class="code-string" style="margin: 0px; padding: 0px; border: 0px; color: rgb(128, 0, 128);">"</span><span class="code-string" style="margin: 0px; padding: 0px; border: 0px; color: rgb(128, 0, 128);">will result in a NullReferenceException"</span>, methodName);</em>
        <span class="code-keyword" style="margin: 0px; padding: 0px; border: 0px; color: rgb(0, 0, 255);">else</span>
            methodInfo.Invoke(instance, <span class="code-keyword" style="margin: 0px; padding: 0px; border: 0px; color: rgb(0, 0, 255);">null</span>);
    }

    <span class="code-keyword" style="margin: 0px; padding: 0px; border: 0px; color: rgb(0, 0, 255);">static</span> <span class="code-keyword" style="margin: 0px; padding: 0px; border: 0px; color: rgb(0, 0, 255);">void</span> WriteClassDetails(<span class="code-keyword" style="margin: 0px; padding: 0px; border: 0px; color: rgb(0, 0, 255);">object</span> instance)
    {
        Type type = instance.GetType();
        WritePropertyReflectively(instance, <span class="code-string" style="margin: 0px; padding: 0px; border: 0px; color: rgb(128, 0, 128);">"</span><span class="code-string" style="margin: 0px; padding: 0px; border: 0px; color: rgb(128, 0, 128);">Property"</span>);
        CallMethodReflectively(instance, <span class="code-string" style="margin: 0px; padding: 0px; border: 0px; color: rgb(128, 0, 128);">"</span><span class="code-string" style="margin: 0px; padding: 0px; border: 0px; color: rgb(128, 0, 128);">Method"</span>);
    }
}</pre><div class=""><br class=""></div></div><div class="">The example code using `dynamic`:</div><div class=""><pre lang="cs" id="pre405681" class="notranslate" style="background-color: rgb(251, 237, 187); padding: 6px; font-stretch: normal; font-size: 9pt; line-height: normal; font-family: Consolas, &quot;Courier New&quot;, Courier, mono; white-space: pre-wrap; border: 1px solid rgb(251, 237, 187); tab-size: 4; overflow: auto; word-wrap: break-word; word-break: break-word; margin-top: 0px;"><span class="code-keyword" style="margin: 0px; padding: 0px; border: 0px; color: rgb(0, 0, 255);">public</span> <span class="code-keyword" style="margin: 0px; padding: 0px; border: 0px; color: rgb(0, 0, 255);">class</span> DynamicTester : Tester
{
    <span class="code-keyword" style="margin: 0px; padding: 0px; border: 0px; color: rgb(0, 0, 255);">void</span> WriteClassDetails(<span class="code-keyword" style="margin: 0px; padding: 0px; border: 0px; color: rgb(0, 0, 255);">dynamic</span> instance)
    {
        <span class="code-keyword" style="margin: 0px; padding: 0px; border: 0px; color: rgb(0, 0, 255);">try</span>
        {
           Console.WriteLine(instance.Property);
           instance.Method();
        }
        <span class="code-keyword" style="margin: 0px; padding: 0px; border: 0px; color: rgb(0, 0, 255);">catch</span> (RuntimeBinderException ex)
        {
            ErrorWriters.WriteRuntimeBinderException(ex);
        }
    }
}</pre><div class="">And a quote from the article:</div></div><div class=""><blockquote type="cite" class="">One thing to conclude on is that this is not less "OO" than the reflective call; it is directly equivalent, but it has a neat syntax and less obtuse exception mechanism. If viewed this way, the addition of dynamicis a large benefit, even before the dynamic language support is considered.</blockquote></div><div class=""><br class=""></div><div class="">As I've said, I'm as far from a C# expert as they come, but the C# devs seem to really appreciate this feature and it doesn't appear to have been abused in the way people here seem to fear for the proposed protocols.</div></body></html>