6

完全な条件式でExpressionSerializationを使用して式ツリーを逆シリアル化すると、三項演算子でエラーが発生します。三項演算子を使用している場合、FullConditionExpression(システムはサポートされていない例外)が発生します

次のリンクからのコードを使用します。

http://archive.msdn.microsoft.com/exprserialization

上記のリンクで利用できる最新バージョンはありますか?

http://metalinq.codeplex.com/

後でこれを試しました

public Expression<Func<object, string>> LabelCriteria { get; set; }

LabelCriteria = x =>
    {
      if (true)
          return "Cash";
      else      
          return " ";
    }

式はif-elseblockをサポートしていません。「ステートメント本体を持つラムダ式は式ツリーに変換できません。他の方法はありますか?」というエラーが表示されます。

4

4 に答える 4

5

条件演算子を使用する必要があります。

LabelCriteria = x => true ? "Cash" : " ";

ただし、条件が定数式()であるため、定数畳み込みのためにコンパイラが式を変更している可能性がありますtrue。そこで変数を使用してみて、何が起こるかを確認してください。

于 2012-09-06T00:24:05.430 に答える
5

次のような方法を使用できます。

string myFunction(Object obj){
     //here your if-else...
}

LabelCriteria = x => myFunction(x);
于 2012-09-06T00:55:41.130 に答える
1

Expression APIを使用して式ツリーを明示的に構築できます。https://msdn.microsoft.com/en-us/library/bb397951.aspxを参照してください。

問題のコードは次のとおりです。

        ParameterExpression x = Expression.Parameter(typeof (object), "x");
        ConditionalExpression body = Expression.IfThenElse(
            Expression.Constant(true),
            Expression.Constant("Cash"),
            Expression.Constant(" ")
            );

        LabelCriteria = Expression.Lambda<Func<object, string>>(body, x);
于 2015-02-10T01:09:54.110 に答える
0

私は解決策を見つけました。

Adiはこの特定のコードを使用していました

次のリンクからのコードを使用します。

http://archive.msdn.microsoft.com/exprserialization

完全な条件式を処理しませんでしたが、条件式を処理します。逆シリアル化のスイッチケースにFullConditionalExpressionを追加したところ、機能しました。スイッチのConditionalExpressionと同じでした。

于 2012-09-07T14:44:22.107 に答える