繁体   English   中英

C#使用属性添加const字段

[英]C# add const field using attributes

我们有“ SomeClass”类:

namespace Namespace
{
    class SomeClass
    {
        // something
    }
}

和属性“ SomeAttribute”:

class SomeAttribute : System.Attribute { }

任务:通过SomeAttribute“公共常量字符串类型”字段添加到所有类市场。 修改后的类必须如下:

class SomeClass
{
    // something
    public const string Type = @"Namespace.SomeClass";
}

UPD:

我正在使用以下方法进行消息事务:

class Manager
{
    // message has 3 parts:
    // string message = String.Format("{0}{1}{2}",
    //     typeof(SomeClass).ToString(),
    //     splitter,
    //     Manager.Serialize(someClassObj)
    // )
    public static string GetType(string message) { /* some code */ }
    public static string Serialize(SomeClass message) { /* XML serialization */ }
    public static SomeClass Deserialize(string message) { /* deserialization */ }
}

class Logic 
{
    public void ProcessMessage(string message)
    {
        switch (Manager.GetType(message))
        {
            case SomeClass.Type:
                {
                    SomeClass msg = Manager.Deserialize(message) as SomeClass;
                    // send message to binded objects
                }
                break;
            case ClassInheritedFromSomeClass.Type:
                {
                    // the same
                }
                break;
            // etc.
        }
    }
}

UPD 2:

有关消息的更多信息。 目前,我正在使用下一种方法:

public class BaseMessage
{
    public const string Type = @"Messages.BaseMessage";
}

public class LoginMessage : BaseMessage
{
    public new const string Type = @"Messages.Client.LoginMessage";

    public string Nickname { get; set; }
    public string Password { get; set; }
}

结论

我认为最好的情况是像这样修改Manger:

class Manager
{
    // create event table

    public Action<BaseMessage> this[string eventName]
    {
        get 
        {
            if (!m_eventTable.ContainsKey(eventName))
            {
                m_eventTable.Add(eventName, new Action<BaseMessage>(message => { }));
            }
            return m_eventTable[eventName]; 
        }
        set
        {
            m_eventTable[eventName] = value;
        }
    }

    public void Send(BaseMessage message, string messageName)
    {
        if (m_eventTable.ContainsKey(messageName) && this[messageName].Method != null)
        {
            this[messageName].Invoke(message);
        }
    }

    private Dictionary<string, Action<BaseMessage>> m_eventTable = new Dictionary<string, Action<BaseMessage>>();
}

switchGetType一起使用是实现多态的错误方法,因为它仅检查派生最多的类(破坏可扩展性)。

在特定情况下,如果您希望Manager负责该行为,则可以使用dynamic关键字和重载方法。 但这将再次违反SOLID,因为它没有开放扩展。

不要尝试以这种方式违反SOLID,而是尝试找到一种使用虚拟方法执行特定于类型的操作的方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM