我有方法为属性赋值并使用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";
的语句。一种使用目标数据类型的方法" Parse"方法。但它可能不适用于其他数据类型。我该如何构建对象?框架中是否有可用的方法?
答案 0 :(得分: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个参数。对于您希望创建的每种对象类型,这显然会有所不同。
解决方案位于CodeObjectCreateExpression
类,可用于代替CodePrimitiveExpression
类。
我建议您更改方法以接受CodeExpression
而不是object propValue
。这样,您就可以提供原语或对象实例化器。
在这种情况下,您可以传递给您的方法:
new CodeObjectCreateExpression(typeof(DateTime), 2016, 09, 17, 18, 50, 0);
您可以在CodeObjectCreateExpression
here找到更多详细信息。
答案 1 :(得分:-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,它将被正确存储。