加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – WCF中的动态ExpandoObject

发布时间:2020-12-15 21:37:20 所属栏目:百科 来源:网络整理
导读:尝试使用枚举类型过程和动态数据操作Ping / Pong我的服务. [ServiceContract ( CallbackContract = typeof ( iStackoverflowCallBack ) )]public interface iStackoverflow{ [OperationContract] void Ping ( Process Operation,dynamic Data );}[ServiceCon
尝试使用枚举类型过程和动态数据操作Ping / Pong我的服务.

[ServiceContract ( CallbackContract = typeof ( iStackoverflowCallBack ) )]
public interface iStackoverflow
{
    [OperationContract]
    void Ping ( Process Operation,dynamic Data );
}

[ServiceContract ( )]
public interface iStackoverflowCallBack
{
    [OperationContract]
    void Pong ( Process Operation,dynamic Data );
}

为什么这项服务有连接问题?

>当实现两个接口时,动态自动转换为对象.
>当从消费者ping我的服务时,ping根本不会到达服务,但服务正常工作.

方案:

[DataContract]
public class SerializableDynamicObject : IDynamicMetaObjectProvider
{
    [DataMember]
    private IDictionary<string,object> dynamicProperties = new Dictionary<string,object>();

    #region IDynamicMetaObjectProvider implementation
    public DynamicMetaObject GetMetaObject (Expression expression)
    {
        return new SerializableDynamicMetaObject(expression,BindingRestrictions.GetInstanceRestriction(expression,this),this);
    }
    #endregion

    #region Helper methods for dynamic meta object support
    internal object setValue(string name,object value) 
    {
        dynamicProperties.Add(name,value);
        return value;
    }

    internal object getValue(string name) 
    {
        object value;
        if(!dynamicProperties.TryGetValue(name,out value)) {
            value = null;
        }
        return value;
    }

    internal IEnumerable<string> getDynamicMemberNames() 
    {
        return dynamicProperties.Keys;
    }
    #endregion
}


public class SerializableDynamicMetaObject : DynamicMetaObject
{
    Type objType;

    public SerializableDynamicMetaObject(Expression expression,BindingRestrictions restrictions,object value) 
        : base(expression,restrictions,value) 
    {
        objType = value.GetType();
    }

    public override DynamicMetaObject BindGetMember (GetMemberBinder binder)
    {
        var self = this.Expression;
        var dynObj = (SerializableDynamicObject)this.Value;
        var keyExpr = Expression.Constant(binder.Name);
        var getMethod = objType.GetMethod("getValue",BindingFlags.NonPublic | BindingFlags.Instance);
        var target = Expression.Call(Expression.Convert(self,objType),getMethod,keyExpr);
        return new DynamicMetaObject(target,BindingRestrictions.GetTypeRestriction(self,objType));
    }

    public override DynamicMetaObject BindSetMember (SetMemberBinder binder,DynamicMetaObject value)
    {
        var self = this.Expression;
        var keyExpr = Expression.Constant(binder.Name); 
        var valueExpr = Expression.Convert(value.Expression,typeof(object));
        var setMethod = objType.GetMethod("setValue",setMethod,keyExpr,valueExpr);
        return new DynamicMetaObject(target,objType));
    }

    public override IEnumerable<string> GetDynamicMemberNames ()
    {
        var dynObj = (SerializableDynamicObject)this.Value;
        return dynObj.getDynamicMemberNames();
    }
}

解决方法

任何WCF操作合同的参数必须是WCF数据协定(或原始类型),否则数据将不会被序列化和传输.

http://msdn.microsoft.com/en-us/library/ms733127.aspx

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读