Как получить класс внутреннего статического класса в другой сборке? - PullRequest
4 голосов
/ 19 апреля 2010

У меня есть класс C в сборке A, например:

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 ]

5 голосов
/ 19 апреля 2010

Попробуйте это ...
Редактировать: Я не думал просто об использовании типа вместо экземпляра объекта, когда он был статическим свойством.
Удалено var obj = Activator.CreateInstance(type); и используется type в prop.GetValue вместо 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);
0 голосов
/ 19 апреля 2010

Да, это можно сделать.

Используется 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");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...