首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在.NET 4中重写动态对象的PropertyDescriptor.GetValue和PropertyDescriptor.SetValue

如何在.NET 4中重写动态对象的PropertyDescriptor.GetValue和PropertyDescriptor.SetValue
EN

Stack Overflow用户
提问于 2010-11-05 17:56:15
回答 3查看 4.9K关注 0票数 5

我们使用DynamicObject创建动态属性,但是我们希望使用PropertyGrid来显示和编辑这些属性。

首先,我找到了this的文章,还有这个one。我尝试使用第二篇文章的代码,但以更通用的方式,基本上将所有方法名称常量替换为变量。但问题是VS2010找不到CSharpGetMemberBinder类型。

有人知道怎么替换它吗?或者最好的方法是什么?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-11-05 18:35:03

您可以简单地转换为IDictionary并设置/检索值,而不是使用该文章的Helper类(已过时):

代码语言:javascript
复制
        public override object GetValue(object component)
        {
            if (_owner != component) throw new InvalidOperationException("GetValue can only be used with the descriptor's owner.");
            //return DynamicHelper.GetValue(component, _propertyName);
            return ((IDictionary<String, object>)component)[_propertyName];
        }

        public override void SetValue(object component, object value)
        {
            if (_owner != component) throw new InvalidOperationException("SetValue can only be used with the descriptor's owner.");
            OnValueChanged(component, EventArgs.Empty);
            //DynamicHelper.SetValue(component, _propertyName, value);
            ((IDictionary<String, object>)component)[_propertyName] = value;
        }

编辑:这可能只适用于ExpandoObjects,这就是本文所使用的。如果您使用不同的支持创建了自己的动态类,则可能需要更改此设置。

票数 1
EN

Stack Overflow用户

发布于 2011-04-21 11:42:27

您可以使用开源框架Dynamitey,它允许您按字符串名称调用的动态属性any IDynamicMetaObjectProvider

代码语言:javascript
复制
    public override object GetValue(object component)
    {
        return Dyanmic.InvokeGet(component,propertyName);
    }

    public override void SetValue(object component, object value)
    {
         Dyanmic.InvokeSet(component,propertyName, value);
    }
票数 1
EN

Stack Overflow用户

发布于 2011-04-21 11:58:10

它应该是这样的:

代码语言:javascript
复制
CallSiteContainer.getLengthSite = CallSite<Func<CallSite, object, object>>.Create(Binder.GetMember(CSharpBinderFlags.None,
    "Length",
    typeof(Program),
    new CSharpArgumentInfo[] {
        CSharpArgumentInfo.Create(CSharpArgumentInfoFlags.None, null)
    }));

相关的集合应该是这样的:

代码语言:javascript
复制
CallSiteContainer.setLengthSite = CallSite<Func<CallSite, object, object, object>>.Create(Binder.SetMember(CSharpBinderFlags.None,
    "Length",
    typeof(Program),
    new CSharpArgumentInfo[] {
        CSharpArgumentInfo.Create(CSharpArgumentInfoFlags.None, null),
        CSharpArgumentInfo.Create(CSharpArgumentInfoFlags.Constant | CSharpArgumentInfoFlags.UseCompileTimeType, null)
    }));
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4104875

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档