C # и CS-Script: переменные не в контексте - PullRequest
0 голосов
/ 11 апреля 2019

[C # новичок]

Привет. Это тест CS-Script 3.28.7, для добавления сценариев в C # . Мне нужно реализовать очень простые функции, которые будут позже прочитаны из файла cfg.

Я просмотрел документы, но не нашел способа читать внешние классы и статические переменные . Я получаю для values и rnd сообщение 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 Ответ

1 голос
/ 11 апреля 2019

Этот должен работать

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.

Некоторые динамические языки имеют связывающий контекст (например, binding в ruby) на уровне языка, поэтому библиотеки могут выполнять чёрную магию. но не в C #.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...