Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 没有定义或扩展方法-ISupportInitialize_C#_.net_.net Reflector - Fatal编程技术网

C# 没有定义或扩展方法-ISupportInitialize

C# 没有定义或扩展方法-ISupportInitialize,c#,.net,.net-reflector,C#,.net,.net Reflector,我正在将dll反编译成C。反编译器生成的一个项目包含1000多行错误代码,如下所示: this.pictureBox1.BeginInit(); 错误385“System.Windows.Forms.PictureBox”不包含 “BeginInit”和无扩展方法“BeginInit”的定义 接受类型为“System.Windows.Forms.PictureBox”的第一个参数 无法找到(是否缺少using指令或程序集 参考?) 常规Picturebox没有BeginInit()方法。我只是

我正在将dll反编译成C。反编译器生成的一个项目包含1000多行错误代码,如下所示:

this.pictureBox1.BeginInit();
错误385“System.Windows.Forms.PictureBox”不包含 “BeginInit”和无扩展方法“BeginInit”的定义 接受类型为“System.Windows.Forms.PictureBox”的第一个参数 无法找到(是否缺少using指令或程序集 参考?)

常规Picturebox没有BeginInit()方法。我只是简单地注释了以下几行:

//this.pictureBox1.BeginInit();
然后我检查了另一个反编译器的输出,它如下所示,并且VS编译器没有以前的错误:

((ISupportInitialize)this.pictureBox1).BeginInit();
由于崩溃,我无法使用第二个反编译器一次导出所有源代码。现在我不知道该怎么办了。我无法运行并调试项目,因为需要先清除其他错误。我的选择是:

  • 把台词注释掉就行了
  • 修改并插入(ISupportInitialize)标记
  • 如果可能,创建一个扩展方法
  • 最后一个选择对我来说似乎最简单。我能创建BeginInit()扩展方法吗?它能正常工作吗?我如何实现和使用ISupportInitialize?

    试试以下方法:

    public static class PictureBoxExtension {
       public static void BeginInit(this PictureBox pb){
         ((ISupportInitialize)pb).BeginInit();
       }
    }
    
    甚至更好的是,您可以对所有支持
    ISupportInitialize
    的控件尝试此操作。这对正常访问是隐藏的,因为它是显式实现的,因此我们可以使用此扩展来公开它(无需强制转换):

    公共静态类SupportInitExtension{
    publicstaticvoidbegininit(此tc),其中T:ISupportInitialize{
    c、 BeginInit();
    }
    }
    
    试试这个:

    public static class PictureBoxExtension {
       public static void BeginInit(this PictureBox pb){
         ((ISupportInitialize)pb).BeginInit();
       }
    }
    
    甚至更好的是,您可以对所有支持
    ISupportInitialize
    的控件尝试此操作。这对正常访问是隐藏的,因为它是显式实现的,因此我们可以使用此扩展来公开它(无需强制转换):

    公共静态类SupportInitExtension{
    publicstaticvoidbegininit(此tc),其中T:ISupportInitialize{
    c、 BeginInit();
    }
    }
    
    我认为解决方案2是“正确”的。至少设计师是这么做的。创建一个带有一些控件的表单,您将看到许多行,如
    ((ISupportInitialize)this.pictureBox1).BeginInit()InitializeComponent()
    方法中使用code>。我认为解决方案2是“正确”的。至少设计师是这么做的。创建一个带有一些控件的表单,您将看到许多行,如
    ((ISupportInitialize)this.pictureBox1).BeginInit()InitializeComponent()
    方法中的code>。错误:扩展方法必须在顶级静态类中定义;PictureBoxExtension是一个嵌套类。@NimeCloud是的,您应该尝试在
    扩展方法
    上搜索。那是因为你不知道如何使用它。它应该放在最外层的名称空间中。好的,找到了。这是第二级静态类,现在可以了。当我确认后,我将标记为答案。@NimeCloud我还用更好的代码更新了它,您可以直接在实现
    ISupportInitialize
    的任何控件上调用
    BeginInit
    。您也可以对
    EndInit
    执行相同的操作。对于.NET2.0扩展方法:错误:扩展方法必须在顶级静态类中定义;PictureBoxExtension是一个嵌套类。@NimeCloud是的,您应该尝试在
    扩展方法
    上搜索。那是因为你不知道如何使用它。它应该放在最外层的名称空间中。好的,找到了。这是第二级静态类,现在可以了。当我确认后,我将标记为答案。@NimeCloud我还用更好的代码更新了它,您可以直接在实现
    ISupportInitialize
    的任何控件上调用
    BeginInit
    。您也可以对
    EndInit
    执行相同的操作。对于.NET 2.0扩展方法: