gpt4 book ai didi

c# - 为 generi 方法抛出的 'Common Language Runtime detected an invalid program.' 异常需要解决方法

转载 作者:太空宇宙 更新时间:2023-11-03 13:56:15 25 4
gpt4 key购买 nike

您能否建议解决 .NET 4.0 defect这导致 Common Language Runtime detected an invalid program. 以下程序启动时出现异常(在 Visual Studio 2010 中):

注意:当在 Visual Studion 2012 中编译同一程序时,行为不会重现。

namespace Namespace1
{
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;

public class Tst1
{
public Action<DataType> Method1<DataType>(Func<DataType> param1) { return this.Method1<DataType>(param1, 0); }
public Action<DataType> Method1<DataType>(Func<DataType> param1, int param2)
{
return param => System.Windows.Forms.MessageBox.Show(param1().ToString() + " " + param.ToString());
}
}

public class TstBase { }

public class Tst2 : TstBase { }

public static class TstExtensions
{
public static string ExtensionMethod<TstType>(this TstType tst)
where TstType : TstBase
{
return "From extension method";
}
}

public class Application
{
public static void Main()
{
Tst1 tst1 = new Tst1();
Tst2 tst2 = new Tst2();

tst1.Method1<string>(tst2.ExtensionMethod)("From main");
}
}
}

注意构建项目需要引用.NET framework 4.0的程序集System.Windows.Forms.dll

背景资料

我在第 3 方提供的低级测试自动化工具上开发了高抽象级别的脚本处理关键字驱动的测试自动化框架(与第 3 方一起执行高抽象级别的关键字驱动脚本的自动化框架用于访问较低级别的图形 UI 的工具)。上面列出的构造需要实现统一的值验证方法。

列出的代码中的每个元素委托(delegate)以下内容:

  • Tst1 - 用于验证值的类
  • 方法 1 - 对从 UI(用户界面)检索的值执行验证的多态方法,可以接受超时以等待 UI 元素获取所需值
  • TstBase - 来自第 3 方低级自动化工具 API 的所有 UI 控件处理的基类
  • Tst2 - 用于处理来自第 3 方低级自动化工具 API 的特定类型控件的类
  • ExtensionMethod - 使用来自第 3 方低级自动化工具 API 的任何控件处理程序类的实例从所有类型的控件中检索文本的通用方法

方法 1 返回作为参数传递给其他方法的委托(delegate),该方法从测试脚本步骤参数中检索值并立即使用它。总体看起来如下所示:

testStepParameters.MakeUseOf("Field1ExpectedValue", validation.Verify<string>(field1.GetValue));

哪里validation.Verify<string>(field1.GetValue)去而不是tst1.Method1<string>(tst2.ExtensionMethod)来自第一个代码片段。

重要通知

我找到了一个解决该缺陷的方法,但我不喜欢它,因为它在一定程度上增加了代码的笨拙程度。我发现的解决方法是用 Lambda 表达式替换扩展方法的直接使用 - 即错误在行时不会重现:

tst1.Method1<string>(tst2.ExtensionMethod)("From main");

替换为行:

tst1.Method1<string>(() => tst2.ExtensionMethod())("From main");

最终形式如下:

testStepParameters.MakeUseOf("Field1ExpectedValue", validation.Verify<string>(() => field1.GetValue()));

当代替 field1 时,使用该解决方法变得完全不愉快变量用于检索控制的复杂调用(可能是一个返回控制的委托(delegate) - 这对于随着时间的推移检查控制状态特别有用,而不用担心控制是如何检索的 - 它自己实现了 GetValue 扩展方法)。

最佳答案

您可以通过自己创建委托(delegate)来修复它,而不是让 C# 为您做。像这样:

 tst1.Method1<string>(new Func<string>(tst2.ExtensionMethod))("From main");

关于c# - 为 generi 方法抛出的 'Common Language Runtime detected an invalid program.' 异常需要解决方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12076274/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com