I'm implementing an automatic "evaluator" for a course I'm currently teaching. The overall idea is that every student delivers a DLL with some algorithms implemented. My evaluator loads all these DLLs using Reflection, finds the student implementations and evaluates them in a tournament. All these algorithms are black-box optimizers, which implement the following interface
public interface IContinuousMetaheuristic { // ... Some unimportant properties Vector Evaluate(Function function, int maxEvaluations, ...); } The class definition for Function (at least the relevant part) is:
public class Function: { private Vector xopt; // The optimum point private double fopt; // The optimum value public double Evaluate(Vector x); } As you can see, I need to pass a Function instance to these metaheuristics. These functions are implemented by myself. Most of them are in some sense random, that is, I choose a random optimum point in the function constructor. That is why you can see an xopt field in the class. The problem is, I don't want my students to be able to access the xopt or fopt fields by Reflection or any other technique, since that would be cheating, or at least, find out if they do it so I can punish them accordingly ;).
So, the general question is: Is there any way to disallow the use of Reflection in a piece of code I have dynamically loaded, or in any other sense disallow this code from accessing private fields (cheating).
Thanks in advance.
optimum pointhave to be in theFunctionclass, or could you not just store it in another data structure not available in the reference dll you give your students?Func<Vector, double>they're going to have a hard time stealing the optimum answers.Functiona remoting proxy.typeof(T)orGetType()).