如何动态评估C#代码?

时间:2020-03-05 18:38:18  来源:igfitidea点击:

我可以执行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函数的返回值并将其转换为所需的一切。

我在几个项目中都做到了这一点,并且效果很好。

希望能帮助到你