如果方法返回IList<object>这样的数据 ,要求在接口方法上添加
[ServiceKnownType(typeof(XXX))]不知道我说法正确不?   
目前有个问题,因为这个返回IList<object>的函数可能有很多种类型,接口方法上加上了
很多[ServiceKnownType(typeof(XXX))]
如:
[OperationContract]
[ServiceKnownType(typeof(AAA))]
[ServiceKnownType(typeof(BBB))]
[ServiceKnownType(typeof(CCC))]
IList<object> GetSomeData();像上面这个写法有没有更好的替代方式啊?感觉这样会写上很多ServiceKnownType

解决方案 »

  1.   

    面向服务就应该要表明提供什么服务,不要你要在.net下用的话,也可以。
    using System;
    using System.Collections.Generic;
    using System.Runtime.Serialization;
    using System.ServiceModel.Channels;
    using System.ServiceModel.Description;
    using System.ServiceModel.Dispatcher;
    using System.Xml;namespace NetContract
    {
        public class NetDataContractAttribute : Attribute, IOperationBehavior
        {
            public void AddBindingParameters(OperationDescription description, BindingParameterCollection parameters)
            {
            }
            public void ApplyClientBehavior(OperationDescription description, ClientOperation proxy)
            {
                ReplaceDataContractSerializerOperationBehavior(description);
            }
            public void ApplyDispatchBehavior(OperationDescription description, DispatchOperation dispatch)
            {
                ReplaceDataContractSerializerOperationBehavior(description);
            }
            public void Validate(OperationDescription description)
            {
            }        private static void ReplaceDataContractSerializerOperationBehavior(OperationDescription description)
            {
                DataContractSerializerOperationBehavior dcsOperationBehavior = description.Behaviors.Find<DataContractSerializerOperationBehavior>();
                if (dcsOperationBehavior != null)
                {
                    description.Behaviors.Remove(dcsOperationBehavior);
                    description.Behaviors.Add(new NetDataContractSerializerOperationBehavior(description));
                }
            }
            public class NetDataContractSerializerOperationBehavior : DataContractSerializerOperationBehavior
            {
                public NetDataContractSerializerOperationBehavior(OperationDescription operationDescription) : base(operationDescription)
                {
                }
                public override XmlObjectSerializer CreateSerializer(Type type, string name, string ns, IList<Type> knownTypes)
                {
                    return new NetDataContractSerializer();
                }
                public override XmlObjectSerializer CreateSerializer(Type type, XmlDictionaryString name, XmlDictionaryString ns, IList<Type> knownTypes)
                {
                    return new NetDataContractSerializer();
                }
            }
        }
    }用这段代码后,在domain中的类就不用加[DataContract]
    在接口上加 [NetDataContract]
    public interface IBaseServer
        {
            [OperationContract(Name = "1")]
            [NetDataContract]
            IList GetList(string statementname, object dataobject);
        }
      

  2.   

    接口类上要声明[ServiceContract]