C# C使用属性添加常量字段
我们有“SomeClass”课: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 {
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语句替换开关。