如果我有私人课程
Class A
{
public static string foo;
}
我可以使用反射来访问该静态字段吗?当然假设我无法改变代码...
我遇到的问题是Class在与我不同的命名空间中定义。
假设我在Test命名空间中,并且我引用了一个带有FOO命名空间的DLL。
namespace FOO
{
Class A
{
public static string bar;
}
}
我想从命名空间TEST访问A类中的 bar 字段。
答案 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);