VS 2017 设计器:找不到方法
VS 2017 Designer: Method not found
我有一个 windows 表单,其中包含一个用户控件(每个控件都在单独的程序集中定义)。窗体和用户控件都调用 BindingList<> 上的扩展方法。扩展方法在第三个程序集中定义。一切编译和运行正常。
但是,如果我尝试在 Visual Studio 2017 设计器中打开表单,我会收到错误消息:
To prevent possible data loss before loading the designer, the following errors must be resolved:
Method not found: 'System.ComponentModel.BindingList1 KamaTrenda.Utilities.Lists.ListUtilities.AddReset(System.ComponentModel.BindingList
1,
System.Collections.Generic.IEnumerable`1)'.
调用堆栈:
at System.ComponentModel.ReflectPropertyDescriptor.SetValue(Object
component, Object value) at
Microsoft.VisualStudio.Shell.Design.VsTargetFrameworkPropertyDescriptor.SetValue(Object
component, Object value) at
System.ComponentModel.Design.Serialization.CodeDomSerializerBase.DeserializePropertyAssignStatement(IDesignerSerializationManager
manager, CodeAssignStatement statement,
CodePropertyReferenceExpression propertyReferenceEx, Boolean
reportError) at
System.ComponentModel.Design.Serialization.CodeDomSerializerBase.DeserializeAssignStatement(IDesignerSerializationManager
manager, CodeAssignStatement statement) at
System.ComponentModel.Design.Serialization.CodeDomSerializerBase.DeserializeStatement(IDesignerSerializationManager
manager, CodeStatement statement)
注释掉此 属性 的 setter 的内容允许在设计器中打开表单:
public IList<IPosition> PositionsToDisplay
{
get { return myPositionsToDisplay.Select(x => x.Position).ToList(); }
set { myPositionsToDisplay.AddReset(value.Select(x => new PositionAdapter(x))); }
}
我的显示位置:
private readonly BindingList<PositionAdapter> myPositionsToDisplay = new SortableBindingList<PositionAdapter>();
和添加重置:
public static class ListUtilities
{
public static BindingList<T> AddReset<T>(this BindingList<T> list, IEnumerable<T> toAdd)
{
list.RaiseListChangedEvents = false;
foreach (T item in toAdd)
list.Add(item);
list.RaiseListChangedEvents = true;
list.ResetBindings();
return list; // for chaining
}
}
我试过添加
[Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
PositionsToDisplay 的定义,没有区别。
我尝试重建,手动删除所有 3 个项目的内容 obj 和 bin 目录,以及 AppData\Local\Microsoft\VisualStudio.0_6d397e1a\ProjectAssemblies 的内容,关闭 VS 2017 中所有打开的文档,关闭解决方案,并重新启动 Visual Studio,但没有任何区别。
既不是窗体也不是控件的.resx文件,参考属性.
表单的 Designer.cs 有一些代码似乎是导致问题的原因:
this.control.PositionsToDisplay = ((System.Collections.Generic.IList<IPosition>)(resources.GetObject("control.PositionsToDisplay")));
删除它(大概是在添加 DesignerSerializationVisibility.Hidden 之后,这样它就不会重新生成)似乎解决了问题。
我有一个 windows 表单,其中包含一个用户控件(每个控件都在单独的程序集中定义)。窗体和用户控件都调用 BindingList<> 上的扩展方法。扩展方法在第三个程序集中定义。一切编译和运行正常。
但是,如果我尝试在 Visual Studio 2017 设计器中打开表单,我会收到错误消息:
To prevent possible data loss before loading the designer, the following errors must be resolved:
Method not found: 'System.ComponentModel.BindingList
1 KamaTrenda.Utilities.Lists.ListUtilities.AddReset(System.ComponentModel.BindingList
1, System.Collections.Generic.IEnumerable`1)'.
调用堆栈:
at System.ComponentModel.ReflectPropertyDescriptor.SetValue(Object component, Object value) at Microsoft.VisualStudio.Shell.Design.VsTargetFrameworkPropertyDescriptor.SetValue(Object component, Object value) at System.ComponentModel.Design.Serialization.CodeDomSerializerBase.DeserializePropertyAssignStatement(IDesignerSerializationManager manager, CodeAssignStatement statement, CodePropertyReferenceExpression propertyReferenceEx, Boolean reportError) at System.ComponentModel.Design.Serialization.CodeDomSerializerBase.DeserializeAssignStatement(IDesignerSerializationManager manager, CodeAssignStatement statement) at System.ComponentModel.Design.Serialization.CodeDomSerializerBase.DeserializeStatement(IDesignerSerializationManager manager, CodeStatement statement)
注释掉此 属性 的 setter 的内容允许在设计器中打开表单:
public IList<IPosition> PositionsToDisplay
{
get { return myPositionsToDisplay.Select(x => x.Position).ToList(); }
set { myPositionsToDisplay.AddReset(value.Select(x => new PositionAdapter(x))); }
}
我的显示位置:
private readonly BindingList<PositionAdapter> myPositionsToDisplay = new SortableBindingList<PositionAdapter>();
和添加重置:
public static class ListUtilities
{
public static BindingList<T> AddReset<T>(this BindingList<T> list, IEnumerable<T> toAdd)
{
list.RaiseListChangedEvents = false;
foreach (T item in toAdd)
list.Add(item);
list.RaiseListChangedEvents = true;
list.ResetBindings();
return list; // for chaining
}
}
我试过添加
[Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
PositionsToDisplay 的定义,没有区别。
我尝试重建,手动删除所有 3 个项目的内容 obj 和 bin 目录,以及 AppData\Local\Microsoft\VisualStudio.0_6d397e1a\ProjectAssemblies 的内容,关闭 VS 2017 中所有打开的文档,关闭解决方案,并重新启动 Visual Studio,但没有任何区别。
既不是窗体也不是控件的.resx文件,参考属性.
表单的 Designer.cs 有一些代码似乎是导致问题的原因:
this.control.PositionsToDisplay = ((System.Collections.Generic.IList<IPosition>)(resources.GetObject("control.PositionsToDisplay")));
删除它(大概是在添加 DesignerSerializationVisibility.Hidden 之后,这样它就不会重新生成)似乎解决了问题。