[英]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>>();
}
將switch
與GetType
一起使用是實現多態的錯誤方法,因為它僅檢查派生最多的類(破壞可擴展性)。
在特定情況下,如果您希望Manager
負責該行為,則可以使用dynamic
關鍵字和重載方法。 但這將再次違反SOLID,因為它沒有開放擴展。
不要嘗試以這種方式違反SOLID,而是嘗試找到一種使用虛擬方法執行特定於類型的操作的方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.