📌  相关文章
📜  缺少编译器所需的成员 'Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo.Create' - C# (1)

📅  最后修改于: 2023-12-03 14:57:00.259000             🧑  作者: Mango

缺少编译器所需的成员 'Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo.Create' - C#

在使用C#编程时,可能会遇到以下错误提示:“缺少编译器所需的成员 'Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo.Create'”。这是因为您的项目中缺少对Microsoft.CSharp.RuntimeBinder程序集的引用。该程序集包含了C#动态语言Runtime Binder的实现,它可以在运行时解决类型问题。

解决方法

要解决此错误,您可以按照以下步骤进行操作:

  1. 打开您的项目,在“引用”中添加对Microsoft.CSharp.RuntimeBinder的引用。
  2. 在需要使用动态元素的文件中,在文件头上方添加以下using语句:using Microsoft.CSharp.RuntimeBinder;
代码示例

下面是一个使用动态元素的代码示例:

using System;
using Microsoft.CSharp.RuntimeBinder;

public class Test
{
    public static void Main()
    {
        dynamic a = 10;
        dynamic b = 20;
        dynamic c = "30";

        int sum = Sum(a, b, c);
        Console.WriteLine(sum);
    }

    public static int Sum(int a, int b, dynamic c)
    {
        var binder = Binder.BinaryOperation(
            CSharpBinderFlags.None,
            ExpressionType.Add,
            typeof(Test),
            new[] {
                CSharpArgumentInfo.Create(CSharpArgumentInfoFlags.None, null),
                CSharpArgumentInfo.Create(CSharpArgumentInfoFlags.None, null),
                CSharpArgumentInfo.Create(CSharpArgumentInfoFlags.UseCompileTimeType, null)
            });
        var callsite = CallSite<Func<CallSite, int, int, dynamic, int>>.Create(binder);
        return callsite.Target(callsite, a, b, c);
    }
}

代码中使用了动态元素,在调用Sum方法时,第三个参数c是字符串类型,但是它被声明为dynamic类型,它可以根据运行时的类型进行强制转换。在创建binder和callsite对象时,使用了CSharpArgumentInfo.Create方法,创建了三个参数信息,其中第三个参数使用了CSharpArgumentInfoFlags.UseCompileTimeType标志,表示使用编译时类型,因此在运行时可以将字符串类型转换为int类型。

结论

如果您在使用C#编写动态代码时遇到了“缺少编译器所需的成员 'Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo.Create'”错误,请确保已经添加对Microsoft.CSharp.RuntimeBinder程序集的引用,并使用using Microsoft.CSharp.RuntimeBinder;语句引入命名空间。同时,您可以参考上述代码示例,使用CSharpArgumentInfo.Create方法创建参数信息,动态地调用方法。