C# Пользовательские атрибуты - как использовать их в качестве инструментов функциональности - PullRequest
0 голосов
/ 09 марта 2020

Извините за абстрактный заголовок, я не знаю, как его сформулировать сам ...

Я делаю небольшую сетевую среду, я хотел бы иметь возможность регистрировать методы внутри список, чтобы я мог вызывать их с индексом, я также хотел бы иметь возможность зарегистрировать их после создания библиотеки DLL, чтобы ее можно было использовать в других проектах, поэтому она должна быть также слабо связаны.

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

По сути, я хотел бы иметь возможность добавлять атрибут к любому методу, а для этого тегового метода - добавлять его самостоятельно в список методов в какое-то событие (предпочтительно во время компиляции, чтобы избежать проблем с производительностью во время выполнения), например:

[Command]
public void DisconnectPlayer(Player player)
{
   // Logic here
}

Возможно ли то, что я сказал?

1 Ответ

0 голосов
/ 10 марта 2020

Я использовал пользовательские атрибуты для определения рабочих процессов для динамической 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 - это каждый шаблон проектирования одновременно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...