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

时间:2012-06-12 20:20:54

标签: c# sorting icomparer

大家好,我不确定我想做的事情是否可以远程实现,但我会尽力解释,并且非常感谢任何建议/想法,

想象一下我有: -

    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实现,并且它将以某种方式在程序中编译或者持久化,然后可用于可用于对属性进行排序的比较。

有没有人对如何处理此事有任何建议?

请问您是否希望我澄清一些内容,因为我知道这是一个有点模糊的问题。

非常感谢提前

亚历

4 个答案:

答案 0 :(得分:0)

当然,有几种不同的技术可以支持这一点。 Reflection.Emit浮现在脑海中,并且由于.NET框架包含一个编译器,您还应该能够发出C#并将其动态编译到您随后加载的程序集。我相信新的动态语言空间有更多的选择。

答案 1 :(得分:0)

您可以使用CSharpCodeProvider(请参阅文档here)将提供的文本编译为DLL,并使用反射加载生成的类。 此外,this SO问题可能对您有很大帮助

答案 2 :(得分:0)

我认为您可以使用MEF

报价: “托管可扩展性框架(MEF)是.NET的组合层,可提高大型应用程序的灵活性,可维护性和可测试性.MEF可用于第三方插件的可扩展性,或者它可以带来松散耦合插件的好处类似于常规应用程序的架构。“

答案 3 :(得分:0)

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

第二个选项是让您的用户实际编写C#代码并即时编译。 (如前所述,Reflection.Emit应该处理最简单的需求。)

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

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