我们使用DynamicObject创建动态属性,但是我们希望使用PropertyGrid来显示和编辑这些属性。
首先,我找到了this的文章,还有这个one。我尝试使用第二篇文章的代码,但以更通用的方式,基本上将所有方法名称常量替换为变量。但问题是VS2010找不到CSharpGetMemberBinder类型。
有人知道怎么替换它吗?或者最好的方法是什么?
发布于 2010-11-05 18:35:03
您可以简单地转换为IDictionary并设置/检索值,而不是使用该文章的Helper类(已过时):
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,这就是本文所使用的。如果您使用不同的支持创建了自己的动态类,则可能需要更改此设置。
发布于 2011-04-21 11:42:27
您可以使用开源框架Dynamitey,它允许您按字符串名称调用的动态属性any IDynamicMetaObjectProvider。
public override object GetValue(object component)
{
return Dyanmic.InvokeGet(component,propertyName);
}
public override void SetValue(object component, object value)
{
Dyanmic.InvokeSet(component,propertyName, value);
}发布于 2011-04-21 11:58:10
它应该是这样的:
CallSiteContainer.getLengthSite = CallSite<Func<CallSite, object, object>>.Create(Binder.GetMember(CSharpBinderFlags.None,
"Length",
typeof(Program),
new CSharpArgumentInfo[] {
CSharpArgumentInfo.Create(CSharpArgumentInfoFlags.None, null)
}));相关的集合应该是这样的:
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)
}));https://stackoverflow.com/questions/4104875
复制相似问题