2013-10-02 5 views
0

Я прошел через приведенный ниже код. Здесь я не могу получить/установить значение переменной во время выполнения. Значение переменной принимается через консоль.Изменение переменной экземпляра во время выполнения с использованием отражения

using System; 
using System.Collections.Generic; 
using System.Text; 
using System.Reflection; 

namespace ReflectionTest 
{ 
    class Addition 
    { 
     public int a = 5, b = 10, c = 20; 
     public Addition(int a) 
     { 
      Console.WriteLine("Constructor called, a={0}", a); 
     } 
     public Addition() 
     { 
      Console.WriteLine("Hello"); 
     } 
     protected Addition(string str) 
     { 
      Console.WriteLine("Hello"); 
     } 

    } 

    class Test 
    { 
     static void Main() 
     { 
      //changing variable value during run time 
      Addition add = new Addition(); 
      Console.WriteLine("a + b + c = " + (add.a + add.b + add.c)); 
      Console.WriteLine("Please enter the name of the variable that you wish to change:"); 
      string varName = Console.ReadLine(); 
      Type t = typeof(Addition); 
      FieldInfo fieldInfo = t.GetField(varName ,BindingFlags.Public); 
      if (fieldInfo != null) 
      { 
       Console.WriteLine("The current value of " + fieldInfo.Name + " is " + fieldInfo.GetValue(add) + ". You may enter a new value now:"); 
       string newValue = Console.ReadLine(); 
       int newInt; 
       if (int.TryParse(newValue, out newInt)) 
       { 
        fieldInfo.SetValue(add, newInt); 
        Console.WriteLine("a + b + c = " + (add.a + add.b + add.c)); 
       } 
       Console.ReadKey(); 
      } 
     } 
    } 
    } 

Заранее спасибо ..

+0

Вы должны передать свой экземпляр SetValue. –

+0

@SimonWhitehead filedinfo сам приходит как null. Таким образом, он даже не попадает в состояние. – Kenta

+0

Я дал ответ ниже. –

ответ

1

Существует несколько проблем.

Во-первых, вы проходите BindingFlags.NonPublic. Это не сработает. Вам необходимо пройти BindingFlags.Public и BindingsFlags.Instance так:

t.GetField(varName, BindingFlags.Public | BindingFlags.Instance); 

Или просто не делают этого вообще:

t.GetField(varName); 

Вы не можете передавать вообще ничего, потому что реализация GetField заключается в следующем:

return this.GetField(name, BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public); 

Так оно и делается для вас.

Кроме того, вы должны передать экземпляры Addition в GetValue и SetValue, например, так:

Console.WriteLine("The current value of " + 
    fieldInfo.Name + 
    " is " + 
    fieldInfo.GetValue(add) + ". You may enter a new value now:"); 
//      ^^^ This 

..и ..

fieldInfo.SetValue(add, newInt); 
//     ^^^ This 
1

Поля в классе является примером конкретного и общественности, но вы используете полдень общественность обязательным флаг вместо флага публичного связывания и не применяя экземпляр привязки флага (используя | для побитового или).

+0

Evenif i use BindingFlag.Public, filedinfo идет как null. Я отредактировал вопрос. – Kenta

+0

Вы забыли | флаг привязки. Экземпляры в дополнение к общественности. –

+0

ya теперь его штраф. я должен передать объект дополнения clas в getValue и Setvalue. Я отредактировал мое сообщение соответственно .. Спасибо – Kenta

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