委托方法和用户控件c#

时间:2018-02-20 23:49:01

标签: c# .net delegates user-controls

嗨,这是我在这里发表的第一篇文章,为不好的英语道歉。

我有很多类都有一个必须重新定义运行时的方法。 以下代码运行正常:

public interface Interface1
{
    Action MyCustomAction { get; set; }
}

public class Class1 : Interface1
{
    private Action _myCustomAction;
    public Action MyCustomAction {  get => _myCustomAction==null?delegate() { }:_myCustomAction; set => _myCustomAction = value; }

    public void DoStuff()
    {
        //do a lot of stuff, then call:
        MyCustomAction();
    }
}

很好,我可以这样做:

 Class1 c1 = new Class1();
 c1.MyCustomAction = delegate () { Console.WriteLine("I successfully redefined the custom action inside a " + c1.ToString()); };
 c1.DoStuff();

并且快乐。

但现在出现问题,请检查以下内容:

public interface Interface1
{
    Action MyCustomAction { get; set; }
}

public partial class Class1: UserControl, Interface1
{
    private Action _myCustomAction ;
    public Action MyCustomAction { get => _myCustomAction == null ? delegate () { }: _myCustomAction; set => _myCustomAction = value; }

    public UserControl1()
    {
        InitializeComponent();
    }

    public void DoStuff() {
        //do a lot of stuff, then call:
        MyCustomAction();
    }
}

除了Class1之外,同样的事情是UserControl 现在,当我将一个Class1用户控件从工具栏拖放到主窗体中时...砰! Visual Studio 2017中出现错误..

  

严重级代码描述项目文件行抑制状态   错误无效的Resx文件。无法加载.RESX文件中使用的类型WindowsFormsApp2.UserControl1 +<> c,WindowsFormsApp2,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null。确保已将必要的引用添加到项目中。第142行,第5行.WindowsFormsApp2 C:\ Users \ tara \ source \ repos \ WindowsFormsApp2 \ WindowsFormsApp2 \ Form1.resx 142

并且在主要形式resx现在出现了许多像这样的奇怪代码

  <data name="userControl11.MyCustomAction" mimetype="application/x-microsoft.net.object.binary.base64">
<value>
    AAEAAAD/////AQAAAAAAAAAMAgAAAEdXaW5kb3dzRm9ybXNBcHAyLCBWZXJzaW9uPTEuMC4wLjAsIEN1
    bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAQBAAAAIlN5c3RlbS5EZWxlZ2F0ZVNlcmlh
    bGl6YXRpb25Ib2xkZXIDAAAACERlbGVnYXRlB3RhcmdldDAHbWV0aG9kMAMEAzBTeXN0ZW0uRGVsZWdh
    dGVTZXJpYWxpemF0aW9uSG9sZGVyK0RlbGVnYXRlRW50cnkhV2luZG93c0Zvcm1zQXBwMi5Vc2VyQ29u
    dHJvbDErPD5jAgAAAC9TeXN0ZW0uUmVmbGVjdGlvbi5NZW1iZXJJbmZvU2VyaWFsaXphdGlvbkhvbGRl
    cgkDAAAACQQAAAAJBQAAAAQDAAAAMFN5c3RlbS5EZWxlZ2F0ZVNlcmlhbGl6YXRpb25Ib2xkZXIrRGVs
    ZWdhdGVFbnRyeQcAAAAEdHlwZQhhc3NlbWJseQZ0YXJnZXQSdGFyZ2V0VHlwZUFzc2VtYmx5DnRhcmdl
    dFR5cGVOYW1lCm1ldGhvZE5hbWUNZGVsZWdhdGVFbnRyeQEBAgEBAQMwU3lzdGVtLkRlbGVnYXRlU2Vy
    aWFsaXphdGlvbkhvbGRlcitEZWxlZ2F0ZUVudHJ5BgYAAAANU3lzdGVtLkFjdGlvbgYHAAAAS21zY29y

我从表单中删除用户控件,错误消失 我添加了用户控件,它再次出现。 我很困惑,我不知道为什么会发生这种情况......以及如何修复

1 个答案:

答案 0 :(得分:0)

您只需将此属性添加到您的媒体资源中:

[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] 

这告诉WinForms设计器不应将该属性保存到代码生成的文件中。

MSDN:

  

指定属性对设计时序列化程序的可见性

     

代码生成器不会为对象生成代码

此外,您可能希望添加[Browsable(false)],以便设计器中根本看不到它。它可能不会影响代码生成,但可以说没有任何一点可以显示其类型无法更改的属性(delegate/Action)。

所以:

[Browsable(false)]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] 
public Action MyCustomAction 
{ 
    get => _myCustomAction == null ? delegate () { }: _myCustomAction; 
    set => _myCustomAction = value; 
}