Как я получаю класс внутреннего статического класса в другом блоке?

У меня есть класс 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 для получения значения свойства строки непосредственно будет достаточен, но не идеальный.

5
задан Kiquenet 23 February 2016 в 12:44
поделиться

2 ответа

Попробуйте это ...
Изменить: Я не думал об использовании просто типа вместо экземпляра объекта, когда это было статическое свойство .
Удалено var obj = Activator.CreateInstance (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);
5
ответ дан 14 December 2019 в 19:07
поделиться

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

Он использует 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 , так что оттуда делайте с ним то, что вам нужно.

Чтобы сделать это в том смысле, в котором вы хотите, превратите код в метод следующим образом:

    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");
0
ответ дан 14 December 2019 в 19:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: