2016-09-17 2 views
0

プロパティに値を代入し、C#CodeDOMを使ってコード文を生成するメソッドがあります。C#でオブジェクトを構築する方法 - CodeDOM

private static CodeAssignStatement setProp(string propName, object propValue, Type propType, Type objType) 
{ 
       CodeAssignStatement declareVariableName = null; 
       if (propType.IsPrimitive) 
       { 
        declareVariableName = new CodeAssignStatement(
        new CodePropertyReferenceExpression(new CodeVariableReferenceExpression("testObj"), propName), new CodePrimitiveExpression(propValue) 
        ); 
       } 
       else 
       { 
        declareVariableName = new CodeAssignStatement(
        new CodePropertyReferenceExpression(new CodeVariableReferenceExpression("testObj"), propName), 
        new CodeVariableReferenceExpression("\"" + propValue?.ToString() + "\"") 
        ); 
       } 

       return declareVariableName; 
} 

プリミティブ値については、ステートメントを正しく生成しています。しかしながら、安静のために、例えば。 DateTimeそれはtestObj.PurchasedOn = "17-09-2016 18:50:00";のようなステートメントを生成します。ターゲットデータ型 "解析"メソッドを使用する1つの方法。ただし、他のデータ型では使用できない場合があります。どのようにオブジェクトを構築できますか?フレームワークで利用可能なメソッドはありますか?

+0

これは一般的な方法ではないと思います。すべての型を異なる方法で構築することができます(また、それらを構築する公的な方法もないため)。 – svick

答えて

-1

何あなたは自分の条件を取り除くとやる取得する場合:

private static CodeAssignStatement setProp(string propName, object propValue, Type propType, Type objType) 
{ 
    CodeAssignStatement declareVariableName = null; 
    declareVariableName = new CodeAssignStatement(
     new CodePropertyReferenceExpression(new CodeVariableReferenceExpression("testObj"), propName), 
     new CodePrimitiveExpression(propValue) 
    ); 

    return declareVariableName; 
} 

CodePrimitiveExpressionは、あなたがそれにほとんど何を割り当てることができることを意味、objectに取るように見えます。そのため、DateTimeを渡すと、正しく格納されます。

+0

名前の通り、メソッドはプリミティブ型のみです。あなたのコードのために、それはexception-'' Unhandled Exception:System.ArgumentException:無効なプリミティブ型:System.DateTimeを与えます。 CodeObjectCreateExpressionを使用することを検討してください。 '' – usercr

+0

私の最後でうまくいくので、答えを投稿してください。 OS XでMono 4.6を使用する –

0

問題は、変数がオブジェクトデータ型である変数に値を代入しようとしていることです。

int i = 123; // This is fine as it assigns the primitive value 123 to the integer variable i. 
string s = "123"; // This is also fine as you're assigning the string value "123" to the string variable s. 
string t = s; // This is fine as long as variable s is a string datatype. 

コードでオブジェクトデータ型に値を割り当てようとしています。

testObj.PurchasedOn = "17-09-2016 18:50:00"; // This won't work as you cannot assign a string constant to a DateTime variable. 

あなたが言及したように、利用可能であればParseメソッドを使用できます。

私たちはあなたはそれが最も可能性が高い。このようになります生成するために期待されているコードを見てみると:

testObj.PurchasedOn = new DateTime(2016, 09, 17, 18, 50, 0); 

あなたが見ることができるように、DateTimeオブジェクトコンストラクタのためにあなたが6つのパラメータを指定する必要があります。これは明らかに作成したいすべてのオブジェクトタイプによって異なります。

解決策は、CodePrimitiveExpressionクラスの代わりに使用できるCodeObjectCreateExpressionクラスにあります。

object propValueではなくCodeExpressionを受け入れるようにメソッドを変更することをお勧めします。そうすれば、プリミティブまたはオブジェクトインスタンシエーターを提供できます。

あなたのメソッドに渡すことができます。この場合

:あなたはCodeObjectCreateExpression hereの詳細を見つけることができます

new CodeObjectCreateExpression(typeof(DateTime), 2016, 09, 17, 18, 50, 0); 

関連する問題