2014-10-26 6 views
1

C# код Я хочу, чтобы выполнить:Как преобразовать строку в фактический код

FullReservationDataControl1.SetData(Reservation); 

, но вместо того, чтобы печатать «FullReservationDataControl1» Я хочу, чтобы петля, так что я сделал цикл, чтобы мне массив строк имея этот контент: FullReservationDataControl+x где x - число. так что мой вопрос заключается в том, чтобы использовать строку, чтобы выполнить команду, а не окончание с ошибкой из-за исполнение:

"FullReservationDataControl4".SetData(Reservation); 
+2

Вы хотите массив элементов управления. – SLaks

+0

Я думаю, вам нужно будет структурировать свои классы и код для лучшего подхода к решению этой проблемы, но вот аналогичная проблема: http://stackoverflow.com/questions/13720565/is-there-anything-like-javascript- eval-in-c-sharp-or-java и это http://www.codeproject.com/Articles/11939/Evaluate-C-Code-Eval-Function http://www.ckode.dk/programming/eval- в-с-да-его-возможно / –

ответ

2

Насколько я знаю, нет ничего, как Eval(), встроенного в C#.

Для ваших целей, учитывая код, который вы опубликовали выше, это лучше сделать, создав 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); 
} 
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); 

Извините за "некоторые", но вы не указали, если t его приложение WinForms или WPF.

Смежные вопросы