C#和CS-Script:变量不在上下文中

时间:2019-04-11 07:38:49

标签: c# cs-script

[C#新手]

嗨。这是对 CS脚本 3.28.7(将脚本添加到C#)的测试。 我需要实现非常简单的功能,以后可以从cfg文件中读取。

我浏览了文档,但是找不到读取外部类和静态变量的方法。我同时收到valuesrnd的消息the name XXX is not available in this context

我忘记了什么?

using System;
using CSScriptLibrary;

namespace EmbedCS
{
    class Program
    {
        public static int[] values = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
        static Random rnd = new Random();

        static void Main(string[] args)
        {
            ExecuteTest();
            Console.Read();
        }

        private static void ExecuteTest()
        {
            bool result;
            var scriptFunction = CSScript.CreateFunc<bool>(@"
                bool func() {
                    int a = rnd.Next(10);
                    int b = rnd.Next(10);
                    return values[a] > values[b];
                }
            ");

            result = (bool)scriptFunction();
            Console.Read();
        }
    }
}

1 个答案:

答案 0 :(得分:1)

这应该工作

using System;
using CSScriptLibrary;

namespace EmbedCS
{
    public class Program
    {
        public static int[] values = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
        public static Random rnd = new Random();

        static void Main(string[] args)
        {
            ExecuteTest();
            Console.Read();
        }

        private static void ExecuteTest()
        {
            bool result;
            var scriptFunction = CSScript.CreateFunc<bool>(@"
                bool func() {
                    int a = EmbedCS.Program.rnd.Next(10);
                    int b = EmbedCS.Program.rnd.Next(10);
                    return EmbedCS.Program.values[a] > EmbedCS.Program.values[b];
                }
            ");

            result = (bool)scriptFunction();
            Console.Read();
        }
    }
}

请记住,在C#中,所有内容都是如此隐式的。

您的func()不是Program的成员。因此他们无法识别Program内部的字段。

某些动态语言在语言级别具有绑定上下文(例如ruby的binding),因此库可以处理黑魔法。但不在C#中。