Фабрика методов - случай против отражения

На днях я наткнулся на какой-то код и подумал, лучший ли это способ сделать это. У нас есть метод, который берет строку из некоторых данных веб-формы и что-то делает с объектом на основе переданной строки. В настоящее время он использует отражение, чтобы определить, какое действие следует предпринять, но мне было интересно, будет ли лучше использовать оператор switch .

Пример:

Изменить: Я добавил третью опцию для делегатов, как было отмечено Люцерно

public class ObjectManipulator
{
    private void DoX(object o) { }
    private void DoY(object o) { }
    private void DoZ(object o) { }

    public void DoAction(string action, object o)
    {
        switch (action)
        {
            case "DoX":
                DoX(o);
                break;
            case "DoY":
                DoY(o);
                break;
            case "DoZ":
                DoZ(o);
                break;
            default:
                throw new Exception(string.Format(
                    "Cannot locate action:{0}", action));
        }
    }

    public void DoActionViaReflection(string action, object o)
    {
        MethodInfo method = typeof(ObjectManipulator).
            GetMethod(action, new Type[] { typeof(object) });
        if (method == null)
        {
            throw new Exception(string.Format(
                "Cannot locate action:{0}", action));
        }
        else
        {
            method.Invoke(this, new object[] { o });
        }
    }
    private Dictionary<string, Action<object>> _methods;
    public ObjectManipulator()
    {
        _methods = new Dictionary<string, Action<object>>()
        {
            {"DoX", o => DoX(o)},
            {"DoY", o => DoY(o)},
            {"DoZ", o => DoZ(o)}
        };
    }
    public void DoActionViaDelegates(string action, object o)
    {
        if (!_methods.ContainsKey(action))
        {
            throw new Exception(string.Format(
                "Cannot locate action:{0}", action));
        }
        else
        {
            _methods[action](o);
        }
    }

}

В первом примере используется переключатель, и, как вы можете видеть, он может быть очень подробным. Второй намного короче, но использует отражение, которого, как я знаю, некоторые люди избегают, как чумы.

Будет ли один метод работать значительно лучше, чем другой?

Изменилась бы производительность, если бы было 100 различных действий вместо трех?

Что бы вы предпочли увидеть в своем коде, если бы читали его?

7
задан Seattle Leonard 20 November 2010 в 19:39
поделиться