如何对属性和变量构造函数使用相同的数据

本文关键字:数据 构造函数 属性 变量 | 更新日期: 2023-09-27 18:35:38

我正在使用 WCF 创建服务器,并且为了创建不同的端点地址,我正在使用函数属性,如以下示例所示:

[OperationContract]
[FaultContract(typeof(ErrorClass))]
[WebInvoke(Method = "POST", UriTemplate = "/endpoint/adress", ResponseFormat = WebMessageFormat.Json)]
public async Task<Stream> EndpointFunction(Stream someContent)
{
    magic
}

然后,在客户端库中,我们定义了相同的数据,以便可以动态构造 url,如下所示:

public const string ServerSettings = "/endpoint/adress/";

我真的很想不要在这两个地方对端点地址进行硬编码。在 c++ 中,我会定义一个宏 #ENDPOINTADRESS"/endpoint/Adress"并在两个地方使用它,但宏在 C# 中不存在。有什么方法可以避免这种代码重复吗?

如何对属性和变量构造函数使用相同的数据

遗憾的是,属性及其值被编译到程序集中。因此,无法在运行时设置其值。

但是,如果可以从客户端引用定义服务器类的程序集,则可以在客户端使用反射来检索属性值。像这样:

// TODO: Add all kinds of safety checks
var mi = typeof(ServerImplementationClass).GetMethod("EndpointFunction");
var atts = mi.GetCustomAttributes(false);
var wi = atts.OfType<WebInvokeAttribute>().FirstOrDefault();
var uri = wi.UriTemplate;    // Yields: "/endpoint/adress"