首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何动态评估C#代码?

如何动态评估C#代码?
EN

Stack Overflow用户
提问于 2008-08-07 12:26:46
回答 16查看 78.3K关注 0票数 106

我可以执行一个eval("something()");来在JavaScript中动态执行代码。有什么方法可以让我在C#中做同样的事情吗?

我要做的一个例子是:我有一个整数变量(比如i),并且我有多个属性:"Property1“、"Property2”、"Property3“等等。现在,我想根据i的值对”Propertyi“属性执行一些操作。

这对于Javascript来说真的很简单。有什么方法可以用C#来完成吗?

EN

回答 16

Stack Overflow用户

回答已采纳

发布于 2008-08-07 12:31:18

免责声明:这个答案是在2008年写的。从那以后,景观发生了巨大的变化。

看看这个页面上的其他答案,尤其是详细介绍Microsoft.CodeAnalysis.CSharp.Scripting的答案。

其余的答案将留在原来的张贴,但已不再准确。

不幸的是,C#不是这样的动态语言。

但是,您可以做的是创建一个包含类和所有内容的C#源代码文件,并通过CodeDom提供程序为C#运行它,并将其编译成程序集,然后执行它。

在MSDN上的这篇论坛文章中包含了一个答案,页面下面有一些示例代码:

从字符串创建匿名方法?

我很难说这是一个很好的解决办法,但无论如何也是可能的。

您希望在这个字符串中使用什么样的代码?如果它是有效代码的一个小子集,例如仅仅是数学表达式,则可能存在其他替代方案。

编辑:嗯,这教会了我首先要彻底阅读问题。是的,反射能给你一些帮助。

如果将字符串拆分为;首先,要获得单个属性,可以使用以下代码为类的特定属性获取PropertyInfo对象,然后使用该对象操作特定对象。

代码语言:javascript
复制
String propName = "Text";
PropertyInfo pi = someObject.GetType().GetProperty(propName);
pi.SetValue(someObject, "New Value", new Object[0]);

链接:PropertyInfo.SetValue法

票数 50
EN

Stack Overflow用户

发布于 2016-06-23 06:33:32

使用Roslyn脚本API (更多的这里的样品):

代码语言:javascript
复制
// add NuGet package 'Microsoft.CodeAnalysis.Scripting'
using Microsoft.CodeAnalysis.CSharp.Scripting;

await CSharpScript.EvaluateAsync("System.Math.Pow(2, 4)") // returns 16

您还可以运行任何代码:

代码语言:javascript
复制
var script = await CSharpScript.RunAsync(@"
                class MyClass
                { 
                    public void Print() => System.Console.WriteLine(1);
                }")

并引用在以前运行中生成的代码:

代码语言:javascript
复制
await script.ContinueWithAsync("new MyClass().Print();");
票数 57
EN

Stack Overflow用户

发布于 2008-08-07 12:31:07

不怎么有意思。您可以使用反射来实现您想要的结果,但是它不会像Javascript中那样简单。例如,如果要将对象的私有字段设置为某个对象,可以使用以下函数:

代码语言: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);
}
票数 14
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4629

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档