如何动态评估C#代码?
我可以执行eval(" something()");
以在JavaScript中动态执行代码。有没有办法让我在C#中做同样的事情?
我想做的一个例子是:我有一个整数变量(例如i
),并且我有多个属性,它们的名称分别为:" Property1"," Property2"," Property3"等。
现在,我想根据" i"的值对" Propertyi"属性执行一些操作。
使用Javascript确实很简单。有什么办法用C#做到这一点?
解决方案
回答
我们可以使用反射来获取属性并调用它。像这样的东西:
object result = theObject.GetType().GetProperty("Property" + i).GetValue(theObject, null);
也就是说,假设具有该属性的对象称为" theObject" :)
回答
我们可以使用原型函数来做到这一点:
void something(int i, string P1) { something(i, P1, String.Empty); } void something(int i, string P1, string P2) { something(i, P1, P2, String.Empty); } void something(int i, string P1, string P2, string P3) { something(i, P1, P2, P3, String.Empty); }
等等...
回答
并不真地。我们可以使用反射来实现所需的功能,但它不会像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); }
回答
不幸的是,没有像这样的动态语言。
但是,我们可以做的是创建一个包含类和所有内容的Csource代码文件,并通过CodeDom提供程序运行该文件,以便Cand将其编译为程序集,然后执行它。
MSDN上的该论坛帖子在页面下方包含一些示例代码的答案:
从字符串创建匿名方法?
我很难说这是一个很好的解决方案,但是还是有可能的。
我们期望在该字符串中使用哪种代码?如果它是有效代码的次要子集,例如仅是数学表达式,则可能存在其他替代方法。
编辑:好吧,这教我先彻底阅读问题。是的,思考可以在这里为我们提供一些帮助。
如果将字符串除以;首先,要获取单个属性,可以使用以下代码为类的特定属性获取PropertyInfo对象,然后使用该对象来操纵特定对象。
String propName = "Text"; PropertyInfo pi = someObject.GetType().GetProperty(propName); pi.SetValue(someObject, "New Value", new Object[0]);
链接:PropertyInfo.SetValue方法
回答
所有这些肯定会起作用。就个人而言,针对该特定问题,我可能会采取一些不同的方法。也许是这样的:
class MyClass { public Point point1, point2, point3; private Point[] points; public MyClass() { //... this.points = new Point[] {point1, point2, point3}; } public void DoSomethingWith(int i) { Point target = this.points[i+1]; // do stuff to target } }
使用这种模式时,必须注意数据是按引用而不是按值存储的。换句话说,不要对基元执行此操作。我们必须使用他们big肿的同类。
我意识到这不完全是问题,但是这个问题已经很好地回答了,我认为也许有替代方法可能会有所帮助。
回答
我现在不是绝对要执行Cstatements,但是我们已经可以在C2.0中执行Javascript语句。开源库Jint可以做到。这是.NET的Javascript解释器。传递一个Javascript程序,它将在应用程序中运行。我们甚至可以将Cobject作为参数传递并对其进行自动化。
另外,如果我们只想评估属性的表达式,请尝试使用NCalc。
回答
我们还可以实现一个Webbrowser,然后加载一个包含javascript的html文件。
然后,在此浏览器上使用document.InvokeScript
方法。可以捕获eval函数的返回值并将其转换为所需的一切。
我在几个项目中都做到了这一点,并且效果很好。
希望能帮助到你