Могу ли я использовать класс PrivateObject или Reflection для доступа к полю в закрытом классе? - PullRequest
1 голос
/ 16 марта 2011

Если у меня есть закрытый класс

Class A
{
    public static string foo;
}

Могу ли я использовать отражение для доступа к этому статическому полю? Если конечно я не могу изменить код ...

У меня проблема в том, что класс определяется в другом пространстве имен, чем я.

Допустим, я нахожусь в пространстве имен Test, и у меня есть ссылка на DLL с пространством имен FOO.

   namespace FOO
   {
     Class A
     {
         public static string bar;
     }
   }

Я хочу получить доступ к полю bar в классе A из пространства имен TEST.

Ответы [ 4 ]

2 голосов
/ 16 марта 2011

это намеренно многословно, так что вы будете понимать, что происходит, шаг за шагом.Он проверяет все поля типа A и ищет одно с именем «foo».

РЕДАКТИРОВАТЬ: он работает для А также в другом пространстве имен.

namespace DifferentNamespace
{
    class A
    {
        public static string foo = "hello";
    }
}

class Program {
    static void Main(string[] args) {
        Type type = typeof(DifferentNamespace.A);
        FieldInfo[] fields = type.GetFields();
        foreach (var field in fields)
        {
            string name = field.Name;
            object temp = field.GetValue(null); // Get value
                                                // since the field is static 
                                                // the argument is ignored
                                                // so we can as well pass a null                
            if (name == "foo") // See if it is named "foo"
            {
                string value = temp as string;
                Console.Write("string {0} = {1}", name, value);
            }
            Console.ReadLine();
        }
    }
}
2 голосов
/ 16 марта 2011

Да, вы можете.Вам нужно будет получить Type - то, как вы это сделаете, будет зависеть от точного характера вашего приложения;Например, Assembly.GetType(string) будет одним из вариантов.После этого вы получаете FieldInfo с Type.GetField, а затем запрашиваете у поля его значение, используя null в качестве цели, поскольку это статическое поле.

1 голос
/ 16 марта 2011

Что наконец-то сработало для меня, так это подход к сборке:

0 голосов
/ 16 марта 2011

Попробуйте

object value = typeof (Program).GetFields(BindingFlags.Static | BindingFlags.Public)
    .Where(x => x.Name == "foo").FirstOrDefault()
    .GetValue(null);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...