如何对属性和变量构造函数使用相同的数据
本文关键字:数据 构造函数 属性 变量 | 更新日期: 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"