我可以将多个[ServiceKnownType]属性合并为一个吗?

时间:2017-02-02 16:26:23

标签: c# .net wcf

假设我有一个通用的抽象基类Fred和派生的泛型类JimBob以及Billy ......

public abstract class Fred<T> { }
public class Jim<T> : Fred<T> { }
public class Bob<T> : Fred<T> { }
public class Billy<T> : Fred<T> { }

如果我想要一个返回其中一个派生类型的WCF服务方法,那么为了避免序列化异常,我需要用四个[ServiceKnownType]属性来装饰服务方法......

[OperationContract]
[ServiceKnownType(typeof(Fred<DooHickey>))]
[ServiceKnownType(typeof(Jim<DooHickey>))]
[ServiceKnownType(typeof(Bob<DooHickey>))]
[ServiceKnownType(typeof(Billy<DooHickey>))]
public Fred<DooHickey> GetDooHickey(int ID) {
  // Whatever...
}

是否可以创建一个将这四个[ServiceKnownType]属性合并为一个的新属性,使我能够...

[OperationContract]
[NewServiceKnownType(typeof(NotSureWhatWouldGoHere))]
public Fred<DooHickey> GetDooHickey(int ID) {
  // Whatever...
}

[NewServiceKnownType]属性可以知道这四个类,并允许我用一行而不是四行来装饰方法。

任何人都知道这是否可能?

编辑:我发现通过使用返回已知类型的方法,我可以解决这个问题。有关详细信息,请参阅this MSDN page,这使我能够创建一个名为KnownTypeHelper的类,其中包含以下方法...

public static IEnumerable<Type> GetTheTypes(ICustomAttributeProvider provider) {
  return new List<Type> {
    typeof(Fred<DooHickey>),
    typeof(Jim<DooHickey>),
    typeof(Bob<DooHickey>),
    typeof(Billy<DooHickey>),
  };
}

然后我可以使用ServiceKnownType属性的变体只用一行来装饰我的服务方法......

[OperationContract]
[ServiceKnownType("GetTheTypes", typeof(KnownTypeHelper))]
public Fred<DooHickey> GetDooHickey(int ID) {
  // Whatever...
}

这很好用,但是将GetTheTypes()方法绑定到特定的泛型类型。我尝试将GetTheTypes()方法设为通用,然后执行此操作......

[ServiceKnownType("GetTheTypes<DooHickey>", typeof(KnownTypeHelper))]

...但是这引发了一个例外,因为它无法找到正确名称的方法。它显然将<DooHickey>解释为方法名称的一部分,而不是通用类型。

那么,有没有办法制作返回类型列表的方法的通用版本?

0 个答案:

没有答案