C#自定义属性-如何将其用作功能工具

问题描述 投票:0回答:1

对不起,我不知道该怎么说的抽象标题...

我正在建立一个小型的网络框架,我想做的是能够在列表中注册方法,以便我可以使用索引来调用它们,我也希望在之后注册它们。已经构建了dll,因此可以在其他项目中使用它,因此也必须进行松散耦合。

[我对使用自定义属性的简单但笨拙的注册方法不满意,我已经看到它们在笨重的框架中用于添加元数据,但更令人惊讶的是将其应用于功能。

因此,本质上,我希望能够将属性添加到任何方法,并使该标记方法能够在某些事件(最好是在编译时,以避免运行时出现性能问题)时将其自身添加到方法列表中。 :

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

我说的可能吗?

c# dll compilation custom-attributes
1个回答
0
投票

我以前使用自定义属性来标识动态调度系统的工作流程。如果希望控制器将参数传递给每个函数并处理返回类型,以及进行循环检测和解析同名方法,则必须进行动态调度。简而言之,这是创建可控流程的困难方法。是的,您可以通过这种方式实现多重继承。

如果您询问有关构建自定义属性的信息,将使用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.
            }
        }
    }

自定义属性使我们能够对标识符等元数据进行硬编码,因此可以使用。但是,我有一个用于自定义流程的完整流程体系结构,以最少的代码即可完成更多工作。

您可以以任意方式组装,扩展和重塑的过程在制造中称为质量定制系统。组织生产流程的技巧是不传递数据。我的体系结构为硬编码和动态表单建模。但是组织和管理协作(生产)流程的规则很复杂,因此您应该在我的网站http://www.powersemantics.com/上研究系统的各个方面。

这是我的体系结构满足您的要求的“在列表中注册方法以使用索引调用它们”。进程包括自定义计算机,仅包含M()方法的类以及对其进行操作的数据点的引用。定制计算机不需要动态调度,因为它们不传递参数。它们受任何DTO需要处理的属性的引用约束。他们自己从堆中获取数据。因此,控制器可以简单地执行其活动的机器路由列表。欢迎全面控制。

   public class MyProduct
   {
       public Cvar<int> X { get; set; }
   }
   public class MyCustomMachine : Producer<MyProduct>, IMachine
   {
       public void M() { ... }
   }

您的直接问题可能是通过索引来控制执行,但是此体系结构解决了以后的所有可控性问题:中断和恢复,扩展和更改那些流程,将部件与UI或BackgroundWorker的业务层相关联,注入控制步骤或默认值动态设置步骤或子流程步骤,等等。

简而言之,POWER一次是每个设计模式。

© www.soinside.com 2019 - 2024. All rights reserved.