有没有办法改变类的属性?

时间:2009-09-02 21:37:44

标签: c# wcf

我正在使用Microsoft REST Stark Kit Preview 2来探索REST Collection WCF服务。在Service.svc.cs类中,有一些类和接口用作基类或组件类。例如:

 public interface ICollectionService<TItem> where TItem : class
 {
    ...
    [WebHelp(Comment = "Returns the items in the collection in JSON format, along with URI links to each item.")]
    [WebGet(UriTemplate = "?format=json", ResponseFormat = WebMessageFormat.Json)]
    ItemInfoList<TItem> GetItemsInJoson();
    ...
  }

  [CollectionDataContract(Name = "ItemInfoList", Namespace = "")]
  public class ItemInfoList<TItem> : List<ItemInfo<TItem>> where TItem : class
  ...

其中ICollectionServices和ItemInfoList都在预览2中的Microsoft.ServiceModel.Web.dll中。我将更改这些项的属性,例如WebHelp的Comment和CollectionDataContract的名称,以便我可以自定义xml节点名称的帮助消息和模板。预览2的更改是在其dll中嵌入这些接口和类,这使得很难进行任何自定义。

所以我的问题是,如果有任何方法可以更改类或接口的属性或覆盖其现有属性,以便我不需要获取源代码进行更改?

3 个答案:

答案 0 :(得分:2)

不,你不能。

您可以做的是从类中继承。如果有问题的属性不可继承,您可以将自己的属性添加到子类中以覆盖它们。

我查看了CollectionDataContractAttribute,至少它是不可继承的。这意味着如果您创建子类,则可以将不同的CollectionDataContract属性应用于该子类。

[CollectionDataContract(Name = "MyItemInfoList", Namespace = "MyNamespace")]
public class MyItemInfoList<TItem> : ItemInfoList<TItem> where TItem : class

但是,对于成员,此方法仅在虚拟时才有效,因此您可以覆盖它们。

答案 1 :(得分:1)

属性在编译时被烧毁,并且不能在运行时设置 for reflection 。您可以在“ComponentModel”中执行一些操作,但它们不适用于此处。这里唯一的另一种常见情况是“i18n”,其中一个属性可能是设计以在运行时(从resx等)获取不同的值,基于一个键而不是代码中设置的描述) - 再次,这不适用于这种情况。

所以,没有。

答案 2 :(得分:0)

就REST启动工具包预览2的自定义问题而言,当模板基本类移动到其核心dll时,似乎禁用了自定义。根据ASP.NET的WCF REST Start kit论坛,自定义功能将在下一个版本中发布(很快)。