【问题标题】:How do I get class of an internal static class in another assembly?如何在另一个程序集中获取内部静态类的类?
【发布时间】:2010-04-19 06:53:48
【问题描述】:

我在程序集 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 反射代码就足够了,但并不理想。

【问题讨论】:

    标签: .net reflection


    【解决方案1】:

    试试这个...
    编辑:当它是一个静态属性时,我没想过只使用类型而不是对象实例。
    删除 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);
    

    【讨论】:

    • 嗯,这和我的回答差不多,但请记住他反映的是静态属性,因此在获取值之前无需使用Activator 实例化它。
    • @Kyle Rozendo,创建对象是对的。不同之处在于获取类型。
    【解决方案2】:

    是的,可以做到。

    它正在使用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);
    

    此代码将在val 中返回“text”,所以从那里做你需要做的事情。

    要按照您想要的方式执行此操作,请将代码制作成如下方法:

        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");
    

    【讨论】:

    • 类本身是内部的,所以 typeof(C) 不能编译。如果你不能在外部程序集中引用一个类的类型,你如何获得它?
    • @Ech - 您是否尝试过使用正确的 BindingFlags 以与上述方法相同的方式反映类?
    • typeof(C) not valid if is internal static class ?
    猜你喜欢
    • 2010-09-23
    • 2011-09-21
    • 2015-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-12
    • 1970-01-01
    相关资源
    最近更新 更多