Сценарии объектов.NET

Для управления исходным кодом, централизованные системы такой как Подрывная деятельность выше к научному использованию из-за ясной единственной точки истины (SPOT). Журналирование изменений и способности вспомнить версии любого файла, без наличия упорно ищет, где найти что-то, имеет огромные преимущества ведения записей. Инструменты как Мерзавец и Монотонность : о, боже хаос, я могу вообразить это, следовал бы! Наличие ясных записей, какая версия сценариев задания взлома использовалась, в то время как играющий с новым датчиком, когда, мимо которого прошел бозон Higgs или та сверхновая звезда аварийно завершился, приведет к счастью.

5
задан Captain Comic 10 November 2009 в 09:25
поделиться

4 ответа

This might be too much for your needs, but I think a robust, flexible way to do it would be creating a couple of meta-data attributes to decorate the classes you might want to call from your shell, something like:

[ScriptableClass]
public class MyClass
{
     [ScriptableMethod(typeof (Destination),typeof(int))]
     public void Run (Destination f, int distance) {}
}

Then, during your shell's startup, you load your assemblies via reflection and look for types marked with the ScriptableClass attribute. For each of them, you inspect their public methods looking for those marked with the ScriptableMethod attribute, and you can build a dictionary of classes and their scriptable methods (along with info about parameters). For the previous example, you would have a 'MyClass.Run' command you can could from the shell. When received, your scripting engine would create / lookup an instance of the class and execute the method.

The advantage of this method is that you wouldn't have to modify your scripting engine every time you add new classes or modify methods.

3
ответ дан 14 December 2019 в 04:41
поделиться

У вас есть два варианта:

  1. Использовать отражение, чтобы найти метод класса с именем approrpiate и вызвать его.

  2. Используйте шаблон команды , где каждый объект команды будет иметь имя и метод Run () . Вы можете легко найти нужную команду по имени, а затем запустить ее.

ОБНОВЛЕНИЕ : Согласен, существует более двух вариантов (см. Ответ Гуффа). Но именно эти двое делают код более понятным, ИМХО.

2
ответ дан 14 December 2019 в 04:41
поделиться

Not really. There are other methods, but if they are better is mostly a matter of taste, and for identifying a string you can't do it much faster than a switch.

If all method have the same parameters, you could set up a dictionary of strings and delegates.
Example:

var methods = new Dictionary<string, Action<int>>();
methods.Add("run", n => MyClass.Run(n));
methods.Add("walk", n => MyClass.Walk(n));
methods.Add("wash", n => MyClass.Wash(n));

string cmd = "run";
int param = 42;
if (methods.ContainsKey(cmd)) {
   methods[cmd](param);
} else {
  Console.WriteLine('Say what, human?');
}
2
ответ дан 14 December 2019 в 04:41
поделиться

Возможно, PowerShell CommandLet будет вариантом, хотя это ограничит вас или ваших пользователей PowerShell (который является лучшей оболочкой IMO).

1
ответ дан 14 December 2019 в 04:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: