如何将字符串转换为实际代码

时间:2014-10-26 18:12:20

标签: c#

我要执行的C#代码:

FullReservationDataControl1.SetData(Reservation);

但是我没有输入'FullReservationDataControl1'而是想循环它,所以我做了一个for循环来获取一个包含这个内容的字符串数组:FullReservationDataControl+x其中x是一个数字。所以我的问题是如何使用字符串来执行命令而不是因执行以下错误而结束:

"FullReservationDataControl4".SetData(Reservation);

2 个答案:

答案 0 :(得分:2)

据我所知,没有像C#内置的eval()。

出于您的目的,考虑到您上面发布的代码,通过创建IEnumerable对象可以做得更好。而不是说:

for (int i = 0; i < MAX; i++)
{ 
    // does not work as written
    ("FullReservationDataControl" + i.ToString()).SetData(Reservation)
}

创建并保持对控件集合的引用,如下所示:

List<FullReservationDataControl> fullResDataControls = new List<FullReservationDataControl>() 
    { 
        /* add all your FullReservationDataControls here */ 
    };

然后遍历它:

foreach (FullReservationDataControl resControl in fullResDataControls)
{
    resControl.SetData(Reservation);
}

答案 1 :(得分:0)

您可以使用Reflection并在由名称(字符串)标识的对象上调用SetData方法。

参考文献: Reflection: How to Invoke Method with parameters

我特别喜欢这种方法:

How do I use reflection to invoke a private method?

static class AccessExtensions
{
    public static object Call(this object o, string methodName, params object[] args)
    {
        var mi = o.GetType ().GetMethod (methodName, System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance );
        if (mi != null) {
            return mi.Invoke (o, args);
        }
        return null;
    }
}

在您的案例中使用示例:

(someResultOfSearchByName as someExpectedType).Call("SetData", Reservation);

对于&#34; some&#34;抱歉,但如果这是WinForms或WPF应用程序,则不提示。