如何编写用户可扩展代码?

时间:2009-03-17 15:48:46

标签: c# reflection eval

作为一个perl程序员,我可以将字符串作为代码进行评估如果我希望,我可以在C#中做同样的事情(使用字符串或其他包含用户输入的对象)吗?

我想要完成的是创建一个对象,其中的方法可以在我的源代码中预定义,或者可以由用户在运行时通过输入表示方法或SQL查询的C#代码的字符串来定义。方法调用应该始终将其标量值作为字符串返回,我相信最好在方法调用中使用一些预定义的“系统”变量,并使用一些“清理”代码来验证字符串是否实际返回。

Psuedo - 结构

 Object Statistic
      string  Name;
      functionref Method;

我想到的架构基本上会实时收集它们,并根据用户的请求将它们添加到用户想要显示的统计列表中。定义的统计信息可以保存到文件中,并在初始化期间加载到主程序中。这样,用户不必继续重新定义所需的统计数据。需要编辑/更新/删除统计信息。

如果成功,那么每当有人决定他们想要在他们的状态板上显示我还没有编写代码的新信息时,我(程序员)将不必去添加新代码为...

有关在C#中从哪里开始阅读以实现此目的的任何想法?

此功能的目的是显示正在运行的系统/数据库的统计信息的程序。要注意的值不一定在设计时知道,也不知道如何定义检索所需的值。我希望允许用户定义任何超出系统预编码的统计信息。

2 个答案:

答案 0 :(得分:1)

结帐this earlier question

但是,还要考虑解决方案的稳定性,可扩展性和安全性。如果您允许任意执行,那么您的应用程序操作和支持将不会很有趣。为外部提供的代码设置一个分隔很好的沙箱。

此外,不要指望普通用户(无论他们是谁)能够编程。

您可能希望通过以下方式提供受限但更易于管理的扩展性而是dependency injection

答案 1 :(得分:1)

我会回应Pontus所说的,特别是关于稳定性,支持成本以及期望用户编写代码。我还会在列表中添加性能,因为这些用户可能不会意识到代码的性能影响。出于这些原因和其他原因,面向用户的eval - 类似的构造在C#中不被认为是明智的,也可能不应该在perl中

相反,请查看.Net中的System.AddIn命名空间,以便为您的应用程序提供插件功能。