首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在C#中提供IComparer实现并在运行时以某种方式将其“编译”到应用程序中是可能的吗?

在C#中提供IComparer实现并在运行时以某种方式将其“编译”到应用程序中是可能的吗?
EN

Stack Overflow用户
提问于 2012-06-13 04:20:54
回答 4查看 202关注 0票数 2

大家好,我不确定我想要做的事情是否可能,但我会尽我最大的努力来解释它,并非常感谢任何建议/想法。

想象一下我有:-

代码语言:javascript
复制
    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实现,然后在程序中以某种方式编译或持久化,然后在可用于对属性进行排序的比较选择中可用。

有没有人对如何处理这个问题有什么建议?

如果你想让我澄清一些事情,请问我,因为我知道这是一个有点晦涩的问题。

非常感谢你提前

亚历克斯

EN

Stack Overflow用户

发布于 2012-06-13 04:27:16

在我看来,你有两个选择。首先,您可以构建自己的语言,该语言可以解析简单的用户命令,然后以JIT方式执行代码。

第二种选择实际上是让用户编写C#代码,然后动态编译它。(正如前面提到的,Reflection.Emit应该能满足大多数简单的需求。)

编辑第三个选项并不完全是您想要的,但是您可以为比较器插件设置一个目录。当您的应用程序启动时,它可以扫描该目录并加载程序集。使用反射,您可以提取实现IComparer接口的任何类,然后将它们作为列表提供给用户。(您还可以使用自定义属性来定义友好的用户名和描述等)。

在这种情况下,您不需要重新编译整个应用程序来快速添加一些新的比较器。此外,如果您有一个超级用户,他们可以使用一些免费的.NET代码编辑器来快速编写自己的比较器,并将其“安装”到目录中。

票数 0
EN
查看全部 4 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11004235

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档