コードインライン(または使用してリフレクション)を評価します。残念ながら、値はすべてCodeDom.CodeStatements内にあります。は、私は、問題の核心に取得するには、この多くを簡略化してきた
だから私は、文字通り、このようなコードを使用して値のために魚を持っている:
public static void SetPropertyValue(this object obj, string propName, object value)
{
obj.GetType().GetProperty(propName).SetValue(obj, value, null);
}
しかし、この:コードは、リフレクションを使用していることを
static string GenerateCode(CodeStatementCollection statements, Control control)
{
var writer = new StringWriter();
var compiler = new CSharpCodeProvider();
foreach (CodeStatement statement in statements)
{
var codeAssignStatement = statement as System.CodeDom.CodeAssignStatement;
var left = codeAssignStatement?.Left as System.CodeDom.CodePropertyReferenceExpression;
if (left == null)
{
continue;
}
var right = codeAssignStatement.Right as System.CodeDom.CodeObjectCreateExpression;
if (right == null)
{
continue;
}
var expressionWriter = new StringWriter();
compiler.GenerateCodeFromExpression(right,expressionWriter,null);
var expression = expressionWriter.ToString();
control.SetPropertyValue(left.PropertyName, expression);
compiler.GenerateCodeFromStatement(statement, writer, null);
}
return writer.ToString();
}
はお知らせ、SetPropertyValueが実際に拡張メソッドであります値がリテラル値であり、式ではない場合にのみ機能します。
実行時に、私がCodeDomステートメントから得ているものは式であり、コントロールもボタンです。
Button.Location = New System.Drawing.Point(12,12);
したがって、上記のコードサンプルでは、表現=「新しいSystem.Drawing.Point(12,12)」
今、私が最初にIF文の一連の実行する必要がありますする必要はありませんタイプを決定する。
リフレクションを使用して式に基づいてプロパティを設定することはできますか?
そうでなければ、これを取り除くために.netのEval関数を使用することはできますか?
あなたはスマートです!これは完全に機能しました。どうもありがとうございました! –