C# 接口(interface)和宏常量替代项

标签 c# interface macros

我正在使用 C# WCF 项目创建 RESTful 服务,并且对接口(interface)和宏常量替代项有疑问。

我有一堆看起来像这样的 WebGet 装饰(高度简化):

public interface IRestSerivce
{
    [OperationContract]
    [WebGet( UriTemplate = "{a}/{b}/{c}/someName01?param={val}" )]
    string Handler01( .. );

    [OperationContract]
    [WebGet( UriTemplate = "{a}/{b}/{c}/someName02?param={val}" )]
    string Handler02( .. );

    [OperationContract]
    [WebGet( UriTemplate = "{a}/{b}/{c}/someName03?param={val}" )]
    string Handler03( .. );
}

等等。

过去广泛使用 C,我通常会为普通文本 "{a}/{b}/{c}" 创建一个宏常量,这样它就不会重复到处。

通常的 C# 替代方案,如 private readonly stringprivate const string 在这种情况下将不起作用,因为有问题的字符串类型(它在装饰中)在任何情况下,接口(interface)都不能有成员。

有什么方法可以使 API 的 future 更改(比如 {b} 变成 {b1}/{b2})不会需要我在所有地方进行更改吗?

到目前为止我发现的解决方案看起来像这里提到的:http://social.msdn.microsoft.com/Forums/en-US/csharplanguage/thread/71e8d202-b249-49bb-a85d-b0ef8207463d/但我认为这不适用于此,因为我认为在接口(interface)的实现中修 retrofit 饰字符串为时已晚。

最佳答案

const string 应该没问题。您不能将它放在接口(interface)中,但可以引用其他类中的常量。

static class Prefixes
{
    public const string Basic = "{a}/{b}/{c}";
}

public interface IRestSerivce
{
    [OperationContract]
    [WebGet( UriTemplate = Prefixes.Basic + "/someName01?param={val}" )]
    string Handler01( .. );
}

使用 const string 是可以的,因为整个值是在编译时计算的,在生成的程序集中,属性中只有组合字符串。

关于C# 接口(interface)和宏常量替代项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16290802/

相关文章:

c# - 带有 NPOI 的 .xlsx 文件损坏问题 - Excel 无法打开文件 'file.xlsx",因为文件格式或文件扩展名无效

C# 动态对象运行时类型检查

c# - 通用方法 - 无法将类型 'string' 隐式转换为 T

unit-testing - Midje 在 Clojure 中的宏上失败

c# - 发布时出错 : System. DirectoryServices.DirectoryServicesCOMException

c# - 直接向用户发送消息

c# - 为什么List类要实现IList接口(interface)?

java - 将对象的引用传递给 null JAVA 后使用接口(interface)

c++ - 忽略 C/C++ 中的死代码警告

c - 这是什么把戏?