C# C使用属性添加常量字段

C# C使用属性添加常量字段,c#,.net-assembly,C#,.net Assembly,我们有“SomeClass”课: namespace Namespace { class SomeClass { // something } } 和属性“SomeAttribute”: class SomeAttribute : System.Attribute { } 任务:通过SomeAttribute“public const string Type”字段添加到所有类别市场。修改的类必须符合以下要求: class SomeClass {

我们有“SomeClass”课:

namespace Namespace
{
    class SomeClass
    {
        // something
    }
}
和属性“SomeAttribute”:

class SomeAttribute : System.Attribute { }
任务:通过SomeAttribute“public const string Type”字段添加到所有类别市场。修改的类必须符合以下要求:

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; }
}
结论

我认为最好的情况是这样修改经理:

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一起使用是实现多态性的错误方法,因为它只检查派生最多的类的可扩展性

在您的特定情况下,您希望管理者负责该行为,您可以使用dynamic关键字和重载方法。但这将再次违反SOLID,因为它不能扩展


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

为什么需要这种方法?某个类的类型更通用。。。?例如typeofSomeClass.FullName,如果常量的值不同于typeofSomeClass.FullName:为什么不直接将值放入属性中?属性是反射内容。您需要的可能更像是基类中返回GetType.FullName的属性。我知道这种情况,但我在switch语句中使用了需要常量值的“Type”。在这种情况下,我建议您用if/else语句替换开关。