Я использовал пользовательские атрибуты для определения рабочих процессов для динамической c системы диспетчеризации. Диспетчеризация Dynami c необходима, если вы хотите, чтобы ваш контроллер передавал параметры каждой функции и обрабатывал возвращаемые типы, наряду с обнаружением цикла и разрешением одноименных методов. Короче говоря, это сложный способ создания контролируемых процессов. Да, вы можете добиться множественного наследования таким способом.
Если вы спрашиваете о создании пользовательских атрибутов, вы будете использовать Reflection для извлечения их значений. Вам необходимо организовать представление ваших методов в вашем проекте, чтобы написать алгоритм для их обнаружения во время выполнения и построения списка.
[AttributeUsage(AttributeTargets.Class)] // or Method, Property, etc.
public class MyCustomAttribute : Attribute
{
public string Instruction { get; set; }
}
// example class
[MyCustomAttribute (Instruction = "Command")]
public class ReportRow { ... }
void OrganizeProcesses()
{
foreach (var propertyInfo in this.GetType().GetProperties())
{
object[] attribute = propertyInfo.GetCustomAttributes(typeof(MyCustomAttribute), true);
if (attribute.Length > 0)
{
var myAttribute = (MyCustomAttribute)attribute[0];
if (String.Compare(propertyInfo.Instruction, "Command") == 0)
// e.g. assign method to dictionary, unless its signature is there.
}
}
}
Настраиваемые атрибуты позволяют нам жестко кодировать метаданные, такие как идентификаторы, и так что это работает. Тем не менее, у меня есть целая архитектура процессов для пользовательских процессов, которая делает намного больше из коробки с минимальным кодом.
Процесс, который вы можете собирать, расширять и изменять любым способом, который вы хотите, известен в производстве как массовая настройка система. Хитрость в организации производственных процессов заключается в том, чтобы не предоставлять данные. Моя архитектура моделирует жестко закодированные и динамические c формы. Но правила организации и управления совместными (производственными) процессами сложны, и поэтому вы должны изучить все аспекты моей системы на моем веб-сайте http://www.powersemantics.com/.
Вот как моя архитектура отвечает вашим требованиям. требование «регистрации методов в списке для вызова их с индексом». Процессы состоят из пользовательских машин, классов, содержащих только метод M (), и ссылок на точки данных, с которыми они работают. Пользовательские машины не требуют динамической c отправки, потому что они не передают параметры. Они связаны ссылкой на свойства того, что DTO нуждается в обработке. Они сами получают данные из кучи. Следовательно, контроллер может просто выполнить свой активный список маршрутизации машин. Добро пожаловать в тотальный контроль.
public class MyProduct
{
public Cvar<int> X { get; set; }
}
public class MyCustomMachine : Producer<MyProduct>, IMachine
{
public void M() { ... }
}
Ваша непосредственная проблема может заключаться в управлении выполнением с помощью индекса, но эта архитектура решает каждую последующую проблему управляемости: прерывание и возобновление, расширение и изменение этих процессов, связывание частей с Пользовательский интерфейс или бизнес-уровень для BackgroundWorker, динамическое внедрение этапов управления, шагов настройки по умолчанию или шагов подпроцесса и т. Д. c.
Короче говоря, POWER - это каждый шаблон проектирования одновременно.