Я наткнулся на какой-то код на днях, и я подумал, что это лучший способ сделать это.У нас есть метод, который берет строку из некоторых данных веб-формы и делает что-то с объектом на основе переданной строки. В настоящее время он использует отражение, чтобы выяснить, какое действие предпринять, но мне было интересно, будет ли оператор switch лучше.
Пример:
Редактировать: я добавил третий вариант для делегатов, как отметил Lucerno
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 различных действий вместо всего лишь 3?
Что вы, скорее, видите в своем коде, если читаете его?