我可以使用PrivateObject类或Reflection来访问私有类中的字段吗?

时间:2011-03-16 09:43:42

标签: c# reflection

如果我有私人课程

Class A
{
    public static string foo;
}

我可以使用反射来访问该静态字段吗?当然假设我无法改变代码...

我遇到的问题是Class在与我不同的命名空间中定义。

假设我在Test命名空间中,并且我引用了一个带有FOO命名空间的DLL。

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

我想从命名空间TEST访问A类中的 bar 字段。

4 个答案:

答案 0 :(得分:2)

这是故意冗长的,所以你会逐步得到正在发生的事情。它检查类型A中的所有字段并查找名为“foo”的字段。

编辑:它也适用于不同命名空间中的A.

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();
        }
    }
}

答案 1 :(得分:1)

是的,你可以。你需要获得Type - 你如何做到这将取决于你的应用程序的确切性质;例如,Assembly.GetType(string)将是一种选择。之后,您获得FieldInfo Type.GetField,然后使用null作为目标,询问该字段的值,因为它是一个静态字段。

答案 2 :(得分:1)

最终对我有用的是大会方法:

assembly = typeof(Class B).Assembly; //Class B is in the same namespace as A
Type type = assembly.GetType("FOO.A");
string val = (string) type.GetField("bar",
    BindingFlags.Public | BindingFlags.Static).GetValue(null);

答案 3 :(得分:0)

尝试

object value = typeof (Program).GetFields(BindingFlags.Static | BindingFlags.Public)
    .Where(x => x.Name == "foo").FirstOrDefault()
    .GetValue(null);