如何在另一个程序集中获取内部静态类的类?

时间:2010-04-19 06:53:49

标签: .net reflection

我在A组中有一个C类:

internal class C
{
  internal static string About_Name {
      get { return "text"; }
  ...
}

我有大约20个这样的静态属性。有没有办法,在外部程序集中,不使用友元汇编属性(仅限.Net反射),获取类C,以便我可以调用任何静态字符串属性,如下所示:

Class C = <some .Net reflection code>;
string expected = C.About_Name;

如果无法做到这一点,直接获取字符串属性值的.Net反射代码就足够了,但并不理想。

2 个答案:

答案 0 :(得分:5)

试试这个......
编辑:当它是静态属性时,我没有想到只使用类型而不是对象实例。
已移除 var obj = Activator.CreateInstance(type);并在prop.GetValue中使用type而不是obj

namespace ClassLibrary1
{
    internal class Class1
    {
        internal static string Test { get { return "test"; } }
    }
    public class Class2
    {

    }
}

var ass = Assembly.GetAssembly(typeof(Class2));
var type = ass.GetType("ClassLibrary1.Class1");
var prop = type.GetProperty("Test", BindingFlags.Static 
    | BindingFlags.NonPublic);
var s = (string)prop.GetValue(type, null);

答案 1 :(得分:0)

是的,可以做到。

它正在使用Type.GetProperty()

示例:

// Load your assembly and Get the Type
// Assembly load code...
...
// Get type
Type asmType = typeof(C);

// Get internal properties
PropertyInfo pi = asmType.GetProperty("About_Name", BindingFlags.NonPublic | BindingFlags.Static);

// Get Value
var val = pi.GetValue(asmType, null);

此代码将在text中返回“val”,因此您可以根据需要执行此操作。

要在您想要的意义上执行此操作,请将代码编写为如下方法:

    private static string GetString(Type classToCheck, string PropertyName)
    {
        PropertyInfo pi = classToCheck.GetProperty(PropertyName, BindingFlags.NonPublic | BindingFlags.Static);

        object val = null;

        if (pi != null)
            val = pi.GetValue(classToCheck, null);

        return (val != null) ? val.ToString() : string.Empty;
    }

用法将是:

string expected = GetString(typeof(C), "About_Name");