C# Как получить значение переменной в другом классе, используя Reflection - PullRequest
0 голосов
/ 05 января 2020

Я уверен, что это просто, но я изо всех сил ... все, что я хочу сделать, это прочитать строковую переменную, хранящуюся в другом классе, но используя строку в качестве ссылки, чтобы указать на этот другой класс (это может быть одним из нескольких классов, каждый из которых имеет эту переменную, поэтому я должен использовать Reflection). Используя Reflection, я смог вызвать метод в другом классе, так что это не кажется таким уж иным ... но пока мне не повезло заставить его работать. Я был бы признателен за любые указатели (не каламбур!).

Class First
{
   public static string theStringToGet = "some text";
}

//-----------------------------------------------------------------------------------------------------------------

Class Second
{
   String classRef = "Namespace.First";
   String localStr = ??? // I think something like: Type.GetType(classRef).GetField("theStringToGet").GetValue();

   // get value of 'theStringToGet' from 'First' class public var and store in 'localStr' in 'Second' class...
}

1 Ответ

0 голосов
/ 05 января 2020

Вы можете просто вызвать элемент stati c с синтаксисом ClassName.memberName:

string localStr = First.theStringToGet;

Если элемент не является stati c, необходимо создать объект из этого класса, а затем используйте синтаксис objectName.memberName:

// Assuming the that `theStringToGet` was not static.
First obj = new First();
string localStr = obj.theStringToGet;

. Для этих целей Reflection вам не нужен.


Если имя класса изменяется, это не работает с stati c члены. Если вам нужно поведение stati c, вы можете использовать шаблон синглтона и либо выводить классы из одного базового класса, либо позволить им реализовывать один и тот же интерфейс. Я покажу вариант интерфейса.

public interface IStringProvider
{
    string TheString { get; }
}

public class First : IStringProvider
{
    public static readonly First Instance = new First();

    private First() {} // Make constructor private, so no one else can instantiate.

    public string TheString => "some text";
}

public class Second : IStringProvider
{
    public static readonly First Instance = new Second();

    private Second() {}

    public string TheString => "another text";
}

Теперь вы можете получить доступ к такой строке

void AccessTheString(IStringProvider provider)
{
    string localStr = provider.TheString;
}

Пример:

AccessTheString(First.Instance);
AccessTheString(Second.Instance);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...