我可以执行一个eval("something()");来在JavaScript中动态执行代码。有什么方法可以让我在C#中做同样的事情吗?
我要做的一个例子是:我有一个整数变量(比如i),并且我有多个属性:"Property1“、"Property2”、"Property3“等等。现在,我想根据i的值对”Propertyi“属性执行一些操作。
这对于Javascript来说真的很简单。有什么方法可以用C#来完成吗?
发布于 2008-08-07 12:31:18
免责声明:这个答案是在2008年写的。从那以后,景观发生了巨大的变化。
看看这个页面上的其他答案,尤其是详细介绍Microsoft.CodeAnalysis.CSharp.Scripting的答案。
其余的答案将留在原来的张贴,但已不再准确。
不幸的是,C#不是这样的动态语言。
但是,您可以做的是创建一个包含类和所有内容的C#源代码文件,并通过CodeDom提供程序为C#运行它,并将其编译成程序集,然后执行它。
在MSDN上的这篇论坛文章中包含了一个答案,页面下面有一些示例代码:
我很难说这是一个很好的解决办法,但无论如何也是可能的。
您希望在这个字符串中使用什么样的代码?如果它是有效代码的一个小子集,例如仅仅是数学表达式,则可能存在其他替代方案。
编辑:嗯,这教会了我首先要彻底阅读问题。是的,反射能给你一些帮助。
如果将字符串拆分为;首先,要获得单个属性,可以使用以下代码为类的特定属性获取PropertyInfo对象,然后使用该对象操作特定对象。
String propName = "Text";
PropertyInfo pi = someObject.GetType().GetProperty(propName);
pi.SetValue(someObject, "New Value", new Object[0]);发布于 2016-06-23 06:33:32
使用Roslyn脚本API (更多的这里的样品):
// add NuGet package 'Microsoft.CodeAnalysis.Scripting'
using Microsoft.CodeAnalysis.CSharp.Scripting;
await CSharpScript.EvaluateAsync("System.Math.Pow(2, 4)") // returns 16您还可以运行任何代码:
var script = await CSharpScript.RunAsync(@"
class MyClass
{
public void Print() => System.Console.WriteLine(1);
}")并引用在以前运行中生成的代码:
await script.ContinueWithAsync("new MyClass().Print();");发布于 2008-08-07 12:31:07
不怎么有意思。您可以使用反射来实现您想要的结果,但是它不会像Javascript中那样简单。例如,如果要将对象的私有字段设置为某个对象,可以使用以下函数:
protected static void SetField(object o, string fieldName, object value)
{
FieldInfo field = o.GetType().GetField(fieldName, BindingFlags.Instance | BindingFlags.NonPublic);
field.SetValue(o, value);
}https://stackoverflow.com/questions/4629
复制相似问题