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

时间:2016-02-22 14:23:28

标签: c# wcf

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

from PIL import Image
from pytesseract.pytesseract import *

im=Image.open('NA2WK.png')

#calculate far left xpos of color
color={}
for i in range(52):
    for j in range(26):
        if im.load()[i,j]!=(192,192,192,255):
            if color.get(im.load()[i,j])==None:
                color[im.load()[i,j]]=9999
            if i<color[im.load()[i,j]]: 
                color[im.load()[i,j]]=i

#get color of left character
if color.values()[0]<color.values()[1]:
    left=color.keys()[0]
    right=color.keys()[1]
else:
    left=color.keys()[1]
    right=color.keys()[0]   

#left processing
imleft=Image.open('test.png')
pix=imleft.load()
for i in range(52):
    for j in range(26):
        if pix[i,j]==(192,192,192,255) or pix[i,j]==right:
            pix[i,j]=(255,255,255,255)
        else:
            pix[i,j]=(0,0,0,255)

print('original:'+image_to_string(im))
print('left:'+image_to_string(imleft))

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

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

我真的很想不要在这两个地方硬编码端点地址。在c ++中,我将定义一个宏#ENDPOINTADRESS&#34; / endpoint / Adress&#34;并在两个地方使用它,但C#中不存在宏。有没有办法避免这种代码重复?

1 个答案:

答案 0 :(得分:0)

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

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

// 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"