大家好,我不确定我想要做的事情是否可能,但我会尽我最大的努力来解释它,并非常感谢任何建议/想法。
想象一下我有:-
public class Attribute{
object Value;
**(X1)**IComparer<T> comparer
}
public class AttributeValues
{
List<Attribute> values;
SortedList<Attribute> Sort(){
this uses the comparer defined in **(X1)** to sort the values in the list
}
}这些类允许用户创建用户定义的属性,并选择预定义的排序算法对值进行排序。在简单的情况下,我可以使用创建的比较器之一执行AttributesValues.Sort(),并在用户选择的源代码中编译该比较器。如果比较是预先知道的,比如简单的升序字母排序,这是很好的。
然而,在某些情况下,需要更多的逻辑,而这是事先不知道的。例如,字符串"4DFG5ET“可能编码了一个需要排序的日期,并且可能有一些具有类似逻辑的其他属性,等等。
如果可能的话,我不想继续编写IComparer实现,我希望我可以在运行时以某种方式在文本框或文件中定义IComparer实现,然后在程序中以某种方式编译或持久化,然后在可用于对属性进行排序的比较选择中可用。
有没有人对如何处理这个问题有什么建议?
如果你想让我澄清一些事情,请问我,因为我知道这是一个有点晦涩的问题。
非常感谢你提前
亚历克斯
发布于 2012-06-13 04:27:16
在我看来,你有两个选择。首先,您可以构建自己的语言,该语言可以解析简单的用户命令,然后以JIT方式执行代码。
第二种选择实际上是让用户编写C#代码,然后动态编译它。(正如前面提到的,Reflection.Emit应该能满足大多数简单的需求。)
编辑第三个选项并不完全是您想要的,但是您可以为比较器插件设置一个目录。当您的应用程序启动时,它可以扫描该目录并加载程序集。使用反射,您可以提取实现IComparer接口的任何类,然后将它们作为列表提供给用户。(您还可以使用自定义属性来定义友好的用户名和描述等)。
在这种情况下,您不需要重新编译整个应用程序来快速添加一些新的比较器。此外,如果您有一个超级用户,他们可以使用一些免费的.NET代码编辑器来快速编写自己的比较器,并将其“安装”到目录中。
https://stackoverflow.com/questions/11004235
复制相似问题