2009-07-13 9 views

答えて

7

既知の型の属性は、DataContractSerializerコンストラクタに渡されます。 customize the way this serializer is instantiatedを使用して、シリアライザのconstructorに既知の型を渡すことができます。これは、アセンブリを反映し、基本クラスから派生するすべての型を見つけることによって実現されます。どのように私はいないメソッドごとにサービス全体でこれを作るのですか、

[ServiceContract] 
public interface FooContract 
{ 
    [OperationContract] 
    [KnownTypesDataContractFormat(typeof(SomeBaseType))] 
    void MyOperation(SomeBaseType arg); 
} 

public class KnownTypesDataContractFormatAttribute : Attribute, IOperationBehavior 
{ 
    public Type BaseType { get; private set; } 
    public KnownTypesDataContractFormatAttribute(Type baseType) 
    { 
     BaseType = baseType; 
    } 

    public void AddBindingParameters(OperationDescription description, BindingParameterCollection parameters) 
    { } 

    public void ApplyClientBehavior(OperationDescription description, System.ServiceModel.Dispatcher.ClientOperation proxy) 
    { 
     IOperationBehavior innerBehavior = new KnownTypesDataContractSerializerOperationBehavior(description, BaseType); 
     innerBehavior.ApplyClientBehavior(description, proxy); 
    } 


    public void ApplyDispatchBehavior(OperationDescription description, System.ServiceModel.Dispatcher.DispatchOperation dispatch) 
    { 
     IOperationBehavior innerBehavior = new KnownTypesDataContractSerializerOperationBehavior(description, BaseType); 
     innerBehavior.ApplyDispatchBehavior(description, dispatch); 
    } 

    public void Validate(OperationDescription description) 
    { } 
} 

public class KnownTypesDataContractSerializerOperationBehavior : DataContractSerializerOperationBehavior 
{ 
    public Type BaseType { get; private set; } 
    public KnownTypesDataContractSerializerOperationBehavior(OperationDescription operationDescription, Type baseType) : base(operationDescription) 
    { 
     BaseType = baseType; 
    } 

    public override XmlObjectSerializer CreateSerializer(Type type, string name, string ns, IList<Type> knownTypes) 
    { 
     return new DataContractSerializer(type, name, ns, knownTypes); 
    } 

    public override XmlObjectSerializer CreateSerializer(Type type, XmlDictionaryString name, XmlDictionaryString ns, IList<Type> knownTypes) 
    { 
     return new DataContractSerializer(type, name, ns, knownTypes); 
    } 

    private IEnumerable<Type> GetKnownTypes() 
    { 
     // Try to find all types that derive from BaseType in the 
     // executing assembly and add them to the knownTypes collection 
     return 
      from type in Assembly.GetExecutingAssembly().GetTypes() 
      where type != BaseType && BaseType.IsAssignableFrom(type) 
      select type; 
    } 
} 
+0

私は、WCFでかなり芯ごめんなさいね:

は、ここで、サンプルコード(テストしていない)のか? –

+0

IOperationBehaviorの代わりにIServiceBehavior(http://msdn.microsoft.com/en-us/library/system.servicemodel.description.iservicebehavior.aspx)を実装すると、 –

+0

を保存しました。ありがとうございます。 – user80855

関連する問題