假设我有一个通用的抽象基类Fred
和派生的泛型类Jim
和Bob
以及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>
解释为方法名称的一部分,而不是通用类型。
那么,有没有办法制作返回类型列表的方法的通用版本?