Jer*_*984 13 c# oop generics interface
我有一个类,它使用一个空接口作为"标记接口",如下所示:
namespace MyNameSpace
{
public interface IMessage
{
//nothing in common here...
}
public class MyMessage : IMessage
{
public void SendMyMessage()
{
//Do something here
}
}
}
Run Code Online (Sandbox Code Playgroud)
我在其他一些帖子中读到了,但在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
}
}
}
Run Code Online (Sandbox Code Playgroud)
一切正常,但主要问题是:
当我在程序的其他地方有一个通用方法时,例如:
public IEnumerable<T> GetAll<T>() where T : IMessage
{
//Return all IMessage things here
}
Run Code Online (Sandbox Code Playgroud)
在上面的函数中,我确实需要添加一些泛型类型约束T
,因此只IMessages
允许.如何在使用自定义属性而不是空接口时完成此操作?
这是否证明使用空接口是正确的?或者我应该使用一个空的抽象类Message
(而不是接口IMessage
,因为MyMessage
实际上是一个Message
).
对你对此的看法非常好奇.
使用自定义属性而不是空接口时,我怎么能做到这一点??? 这是否证明使用空接口是正确的?
你不能 - 至少,不能在编译时.您当然可以在运行时检查属性.
或者我应该使用一个空的抽象类Message
基类比接口更具限制性; 我个人会施加最少的开销.但我想知道即使是人工界面(它什么都不给你)本身就是开销,另一种选择就是:不要提出任何这样的要求.让人们添加一个接口只是为了一个方法编译并不会给你带来太多的东西,而不仅仅是一个没有约束的泛型方法.
由于C# 当前不提供任何基于属性的通用约束,因此除了使用标记接口之外,您别无选择。
有趣的是,CA1040 上的文档页面声明了以下规则的例外情况:
当接口用于在编译时识别一组类型时,可以安全地禁止来自此规则的警告。
确定“编译时的一组类型”似乎正是评估泛型约束时所需要的,我现在想知道该文档页面的作者是否考虑到了这一点。