> On Dec 5, 2017, at 5:47 AM, Benjamin G <benjamin.garrig...@gmail.com> wrote:
> 
> 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  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.

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.

https://www.codeproject.com/Articles/69407/The-Dynamic-Keyword-in-C

The example code using reflection:
public class ReflectiveTester : Tester
{

    static void WritePropertyReflectively(object instance, string propertyName)
    {
        Type type = instance.GetType();
        PropertyInfo propertyInfo = type.GetProperty(propertyName);
        if (propertyInfo == null)
            Console.WriteLine("Property \"{0}\" not found, propertyInfo " + 
                              "is null\r\npropertyInfo.GetValue(...) will 
result " + 
                              "in a NullReferenceException", propertyName);
        else
            Console.WriteLine(propertyInfo.GetValue(instance, null));
    }

    static void CallMethodReflectively(object instance, string methodName)
    {
        Type type = instance.GetType();
        MethodInfo methodInfo = type.GetMethod(methodName);
        if (methodInfo == null)
            Console.WriteLine("Method \"{0}\" not found, " + 
                              "methodInfo set to null\r\nmethodInfo.Invoke(...) 
" + 
                              "will result in a NullReferenceException", 
methodName);
        else
            methodInfo.Invoke(instance, null);
    }

    static void WriteClassDetails(object instance)
    {
        Type type = instance.GetType();
        WritePropertyReflectively(instance, "Property");
        CallMethodReflectively(instance, "Method");
    }
}

The example code using `dynamic`:
public class DynamicTester : Tester
{
    void WriteClassDetails(dynamic instance)
    {
        try
        {
           Console.WriteLine(instance.Property);
           instance.Method();
        }
        catch (RuntimeBinderException ex)
        {
            ErrorWriters.WriteRuntimeBinderException(ex);
        }
    }
}
And a quote from the article:
> 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.


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.
_______________________________________________
swift-evolution mailing list
swift-evolution@swift.org
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to