我有一个类,它使用空接口作为“标记接口”,如下:
namespace MyNameSpace
{
public interface IMessage
{
//nothing in common here...
}
public class MyMessage : IMessage
{
public void SendMyMessage()
{
//Do something here
}
}
}
我在其他帖子和MSDN上读到,(http://msdn.microsoft.com/en-us/library/ms182128.aspx) 这种方式应该被避免使用,而是应该使用自定义属性代替空接口。因此,我可以像这样重构我的代码:
namespace MyNameSpace
{
public class MessageAttribute : Attribute
{
//nothing in common here...
}
[MessageAttribute]
public class MyMessage
{
public void SendMyMessage()
{
//Do something here
}
}
}
一切都正常工作,但主要问题是:
当我在程序的其他地方有一个通用方法时,例如:
public IEnumerable<T> GetAll<T>() where T : IMessage
{
//Return all IMessage things here
}
在上面的函数中,我确实需要在
T
上添加一些通用类型约束,以便只允许 IMessages
。如果使用自定义属性而不是空接口,我该如何实现这一点呢?这是否证明了使用空接口的必要性?或者我应该使用一个空的抽象类
Message
(而不是接口 IMessage
),因为 MyMessage
实际上是一种 Message
。非常想知道你对此的看法。
IMessage
不仅仅是一个标记接口。 - Hossain MuctadirGetAll
而是要用GetAll<T> where T:IMessage
?IMessage
与方法的逻辑有何相关性?由于IMessage
没有成员,所以这个限制有什么作用? - dcastro