簡體   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