2

以下に示すswitchステートメントの使用を避けるために、ac#ステートメントを動的に作成しようとしています。CodeSnippetStatementクラスを調べましたが、機能させることができませんでした。

動的アプリ;

        switch (entity)
        {
            case "entity_1":
                apps = Xrm.Entity_1Set.SingleOrDefault(a => a.Id.Equals(guid));
                break;
            case "entity_2":
                apps = Xrm.Entity_2Set.SingleOrDefault(a => a.Id.Equals(guid));
                break;
            case "entity_3":
                apps = Xrm.Entity_3Set.SingleOrDefault(a => a.Id.Equals(guid));
                break;

..。

私はこのようなことをしたいと思います(エンティティを動的に文字列に渡し、ステートメントを実行時に実行するように変換します):

apps = CodeSnippetStatement(String.Format("Xrm。{0}Set.SingleOrDefault(a => a.Id.Equals(guid)"、entity));

それは可能ですか?

4

1 に答える 1

1

Entity_1Setのパブリックプロパティであると仮定すると、Xrmリフレクションを使用できます。

using System.Reflection; // at the top of your code file

var propertyName = "E" + entity.Substring(1) + "Set";
apps = Xrm.GetType().GetProperty(propertyName ).GetValue(Xrm);

これはXrm、がクラスのインスタンスである場合にのみ機能します(静的クラス参照ではありません)。

リフレクションは、プロパティへの直接アクセスよりも遅いことに注意してください。これをたまにしか行わない場合、この時間コストはそれほど高くありません。しかし、ループ内では、合計する可能性があります。

もう1つの手法は、EntitySetインスタンスをディクショナリにキャッシュすることです。

private Dictionary<string, EntitySet> entityMappings; // at the top of your class

var xrm = GetXrmFromSomewhere();
entityMappings = new Dictionary<string, EntitySet>
{
    { "entity_1", xrm.Entity_1Set },
    { "entity_2", xrm.Entity_2Set },
    { "entity_3", xrm.Entity_3Set }
};

次に、次のことを行う必要があります。

var app = entityMappings[entity].SingleOrDefault(a => a.Id.Equals(guid));
于 2012-07-26T23:31:56.617 に答える