我的文本文件如下:
AssembleComponent Motor = new AssembleComponent;
AssembleComponent Shaft = new AssembleComponent;
......
Motor.cost = 100;
Motor.quantity = 100;
Shaft.cost = 10;
Shaft.quantity = 100;
......
我希望在C#中执行这些代码行,这样我就可以将这些Motor.cost,Motor.quantity,Shaft.cost,Shaft.quantity变量存储在内存中供以后计算。
我能做些什么来实现这个目标?
答案 0 :(得分:3)
将其存储为XML
<?xml version="1.0" encoding="UTF-8"?>
<Components>
<Component name="Motor" cost="100" quantity="100" />
<Component name="Shaft" cost="10" quantity="100" />
</Components>
假设你有这个定义
public class AssembleComponent
{
public decimal Cost { get; set; }
public int Quantity { get; set; }
}
像这样加载
var components = new Dictionary<string, AssembleComponent>();
XDocument doc = XDocument.Load(@"C:\Users\Oli\Desktop\components.xml");
foreach (XElement el in doc.Root.Descendants()) {
string name = el.Attribute("name").Value;
decimal cost = Decimal.Parse(el.Attribute("cost").Value);
int quantity = Int32.Parse(el.Attribute("quantity").Value);
components.Add(name, new AssembleComponent{
Cost = cost, Quantity = quantity
});
}
然后,您可以访问这样的组件
AssembleComponent motor = components["Motor"];
AssembleComponent shaft = components["Shaft"];
注意:通过在运行时调用编译器动态创建变量名称并不是很有用,因为您需要在编译时(或设计时,如果您愿意)了解它们,以便对它们执行一些有用的操作。因此,我将组件添加到字典中。这是创建&#34;变量的好方法。动态。
答案 1 :(得分:2)
您可以使用Microsoft.CSharp.CSharpCodeProvider
即时编译代码。
具体来说,请查看CompileAssemblyFromFile。
答案 2 :(得分:2)
如果只是关于数据,请不要使用平面文本文件而是使用XML。
您可以将XML反序列化为对象并对其执行必要的操作。
答案 3 :(得分:2)
以下是我过去使用的一些代码,它们可以大多数您想要的代码,但您可能需要根据您的特定需求进行调整。简而言之,它执行以下操作:
此时它就像执行一个普通的静态方法一样,所以当你说你想把结果留在内存中供以后使用时,你必须弄清楚它是如何工作的。
public void CompileAndExecute(string CodeBody)
{
// Create the compile unit
CodeCompileUnit ccu = CreateCode(CodeBody);
// Compile the code
CompilerParameters comp_params = new CompilerParameters();
comp_params.GenerateExecutable = false;
comp_params.GenerateInMemory = true;
comp_params.TreatWarningsAsErrors = true;
comp_results = code_provider.CompileAssemblyFromDom(comp_params, ccu);
// CHECK COMPILATION RESULTS
if (!comp_results.Errors.HasErrors)
{
Type output_class_type = comp_results.CompiledAssembly.GetType("TestNamespace.TestClass");
if (output_class_type != null)
{
MethodInfo compiled_method = output_class_type.GetMethod("TestMethod", BindingFlags.Static | BindingFlags.Public);
if (compiled_method != null)
{
Delgate created_delegate = Delegate.CreateDelegate(typeof(System.Windows.Forms.MethodInvoker), compiled_method);
if (created_delegate != null)
{
// Run the code
created_delegate.DynamicInvoke();
}
}
}
}
else
{
foreach (CompilerError error in comp_results.Errors)
{
// report the error
}
}
}
public CodeCompileUnit CreateCode(string CodeBody)
{
CodeNamespace code_namespace = new CodeNamespace("TestNamespace");
// add the class to the namespace, add using statements
CodeTypeDeclaration code_class = new CodeTypeDeclaration("TestClass");
code_namespace.Types.Add(code_class);
code_namespace.Imports.Add(new CodeNamespaceImport("System"));
// set function details
CodeMemberMethod method = new CodeMemberMethod();
method.Attributes = MemberAttributes.Public | MemberAttributes.Static;
method.ReturnType = new CodeTypeReference(typeof(void));
method.Name = "TestMethod";
// add the user typed code
method.Statements.Add(new CodeSnippetExpression(CodeBody));
// add the method to the class
code_class.Members.Add(method);
// create a CodeCompileUnit to pass to our compiler
CodeCompileUnit ccu = new CodeCompileUnit();
ccu.Namespaces.Add(code_namespace);
return ccu;
}
答案 4 :(得分:0)
您有两个主要选择: