string.Format
ツリーを使用 して電話をかけようとしています
私の供給が暗黙の変換を適用しないように見える署名params Expression[] _ParameterExpressions
と一致しないため、少し作業が必要でした。string.Format
object[]
私の現在の解決策は、提供されたパラメータを次のように変換することobject[]
です
NewArrayExpression _NewArray = Expression.NewArrayInit(typeof(object), _ParameterExpressions.Select(ep => Expression.Convert(ep, typeof(object))));
パラメータを渡すようにプロキシ関数を設定しますstring.Format
(これが必要です。そうしないと、一致する署名が見つからなかったと言えます)
static string ReplaceParameters(string format, params object[] obj)
{
return string.Format(format, obj);
}
static IEnumerable<Expression> ReplaceStringExpression(Expression exp)
{
yield return exp;
yield return _NewArray;
}
そして最後に私の電話
ConstantExpression ce = Expression.Constant(orginalString, typeof(string));
MethodCallExpression me = Expression.Call(typeof(RuleParser), "ReplaceParameters", null,
ReplaceStringExpression(ce).ToArray());
式は機能しますが、追加のボクシングプロセスを含む新しい配列を作成するというアイデアはあまり好きではありません。このような単純な関数呼び出しではやり過ぎだったと思います。
string.Format
この通話を改善するにはどうすればよいですか?
==========
編集
私の研究にいくらかの進歩があります。今は捨てることができますReplaceParameters
が、それでもオブジェクトの配列を作成するのは好きではありません_NewArray
MethodCallExpression me = Expression.Call(
typeof(string).GetMethod("Format", new Type[2] { typeof(string), typeof(object[]) }),
ReplaceStringExpression(ce).ToArray());