2

こんにちは皆さん、私がやりたいことがリモートで可能かどうかはわかりませんが、それを説明するために最善を尽くします。提案/アイデアを本当に感謝します.

私が持っていると想像してください:-

    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
        }
    }

これらのクラスを使用すると、ユーザーはユーザー定義の属性を作成し、定義済みの並べ替えアルゴリズムを選択して値を並べ替えることができますユーザーによって選択されました。これは、単純なアルファベットの昇順ソートなど、比較が事前にわかっている場合に適しています。

ただし、より多くのロジックが必要であり、それが事前にわからない状況がいくつかあります。たとえば、文字列「4DFG5ET」は、ソートが必要な日付をコード化している可能性があり、同様のロジックなどを持つ他の属性が存在する可能性があります。

可能であれば、IComparer の実装を書き続けたくないので、何らかの方法で IComparer の実装を実行時にテキスト ボックスまたはファイルに定義し、プログラムで何らかの方法でコンパイルするか、永続化して利用できるようにしたいと考えています。属性のソートに使用できる比較の選択。

これにアプローチする方法について何か提案はありますか?

少し曖昧な質問であることはわかっているので、何かを明確にしてほしいかどうか尋ねてください。

よろしくお願いします

アレックス

4

4 に答える 4

0

確かに、それをサポートするさまざまなテクノロジーがいくつかあります。Reflection.Emit が頭に浮かびます。.NET フレームワークにはコンパイラが含まれているため、C# を出力して、それをオンザフライでアセンブリにコンパイルし、それをロードすることもできるはずです。新しい動的言語スペースには、より多くのオプションがあると思います。

于 2012-06-12T20:24:26.217 に答える
0

(こちらCSharpCodeProviderのドキュメントを参照) を使用して、提供されたテキストを DLL にコンパイルし、リフレクションを使用して結果のクラスをロードできます。また、このSOの質問はあなたに役立つかもしれません

于 2012-06-12T20:24:52.350 に答える
0

そのためにMEFを使用できると思います:

引用: 「Managed Extensibility Framework (MEF) は、大規模なアプリケーションの柔軟性、保守性、およびテスト容易性を向上させる .NET のコンポジション レイヤーです。MEF は、サード パーティのプラグインの拡張性に使用することも、大まかな利点をもたらすこともできます。プラグインのようなアーキテクチャを通常のアプリケーションに結合しました。」

于 2012-06-12T20:25:16.917 に答える
0

ご覧のとおり、選択肢は 2 つあります。まず、単純なユーザー コマンドを解析し、JIT 方式でコードを実行できる独自の言語を構築できます。

2 番目のオプションは、実際にユーザーが C# コードを記述し、その場でコンパイルできるようにすることです。(前述のように、Reflection.Emit はほとんどの単純なニーズに対処する必要があります。)

EDIT 3番目のオプションは、まさにあなたが望んでいたものではありませんが、比較プラグイン用のディレクトリをセットアップできます。アプリケーションが起動すると、そのディレクトリをスキャンしてアセンブリをロードできます。リフレクションを使用すると、IComparer インターフェイスを実装するクラスを抽出し、それらをリストとしてユーザーに提供できます。(カスタム属性を使用して、わかりやすいユーザー名や説明などを定義することもできます)。

この場合、新しい比較演算子をすばやく追加するためだけに、アプリケーション全体を再コンパイルする必要はありません。また、スーパーユーザーがいる場合は、無料の .NET コード エディターを使用して、独自のコンペアラーをすばやく作成し、それらをディレクトリに "インストール" することができます。

于 2012-06-12T20:27:15.997 に答える