C#自定义属性替代

时间:2009-07-23 18:28:31

标签: c#

目前,我已经创建了一个包含~30个属性的类。这样做是为了稍后建立URL请求(即“http://www.domain.com/test.htm?var1=a&var2=b...&var30=dd”)。

我面临的问题是属性名称不一定与查询变量名称匹配(这是不同的)。例如,我可能有一个名为“BillAddress”的变量,而查询变量则需要是“as_billaddress”。

我无法控制查询变量命名方案,因为它们是在外部源设置的。

我使用的一种可能的解决方案是创建自定义属性并使用各自的查询对应项来修饰属性:

[CustomQueryAttribute("as_billaddress")]
string BillAddress{get;set;}

要检索属性,需要稍微反思,并且由于属性数量较多,我很好奇是否有更简洁的方法来完成此功能。与没有反射设置/检索自定义属性相比,可以将备用字符串变量绑定到任何属性。

我也一直在考虑将每个变量设置为一种KeyValuePair,每个键代表查询对应物,但我没想到这个想法。

总结/澄清我的上述背景故事,您将如何将字符串与属性(不是属性的值)相关联?

与往常一样,任何评论都非常感谢。

3 个答案:

答案 0 :(得分:3)

我可能会坚持使用自定义属性,但另一个可能的选择是执行类似于保存具有字符串和属性信息(或属性名称)的静态字典,因此您可以通过此直接获取/设置属性

类似的东西:

static Dictionary<string, PropertyInfo> propertyMap = new Dictionary<string, PropertyInfo>();

static MyClass()
{
     Type myClass = typeof(MyClass);
     // For each property you want to support:
     propertyMap.Add("as_billaddress", MyClass.GetProperty("BillAddress"));
     // ...
}

然后你可以在每个调用中进行字典查找而不是使用反射...这也可以使用配置设置相当容易,因此你可以在运行时重新配置映射。

答案 1 :(得分:1)

自定义属性对我来说似乎是最好的选择 - 框架似乎也做了很多(特别是序列化)。

答案 2 :(得分:0)

如果你看一下流行的ORM映射器,那么几乎所有的都使用自定义属性或某种XML映射文件。后者的优点是您可以修改映射而无需重新编译应用程序 - 缺点是它会损害性能。但是,我会说你的选择似乎非常合理。