Я использую автоматический "оценщик" для курса, который я сейчас преподаю. Общая идея заключается в том, что каждый ученик предоставляет DLL с некоторыми реализованными алгоритмами. Мой оценщик загружает все эти библиотеки DLL с помощью Reflection, находит реализацию учащегося и оценивает их в турнире. Все эти алгоритмы - это оптимизаторы "черного ящика", которые реализуют следующий интерфейс
public interface IContinuousMetaheuristic
{
// ... Some unimportant properties
Vector Evaluate(Function function, int maxEvaluations, ...);
}
Определение класса для Function
(по крайней мере, соответствующей части):
public class Function:
{
private Vector xopt; // The optimum point
private double fopt; // The optimum value
public double Evaluate(Vector x);
}
Как вы можете видеть, мне нужно передать экземпляр Function
в эти метаэвристики. Эти функции выполняются мною. Большинство из них в некотором смысле случайны, то есть я выбираю случайную оптимальную точку в конструкторе функции. Вот почему вы можете увидеть поле xopt
в классе. Проблема в том, что я не хочу, чтобы мои ученики имели доступ к полям xopt
или fopt
Reflection или любой другой техникой, поскольку это было бы обманом или, по крайней мере, выяснить, делают ли они это, поэтому я могут наказать их соответственно;).
Итак, общий вопрос: есть ли способ запретить использование Reflection в куске кода, который я динамически загрузил, или в любом другом смысле не разрешает этому коду обращаться к закрытым полям (обманывать).
Спасибо заранее.