2015-07-31 4 views
0

Я задал вопрос здесь ранее, но я не объяснил правильно, поэтому получил правильные ответы на неправильный вопрос.C# перечислять значения из нового экземпляра класса

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

Я не могу изменить этот класс и опубликовать его по различным причинам.

Что мне нужно сделать, это перечислить через и получить значение переменной Text, сохраняемые:

public class StringReader 
{ 

    private string LongText = "this is the text i need to return"; 
    private string Text; 

    public StringReader() 
    { 

     Text = LongText; 
    } 
} 

В методе я пытаюсь получить значение Text Я зову

StringReader sReader = new StringReader(); 
List<StringReader> readers = new List<StringReader>() { sReader}; 

Читатели имеют длинный текст и текст, но я изо всех сил пытаюсь вернуть значение текста.

Вместо этого он просто возвращает Тип мне.

+2

Если поля 'private', вы не можете получить к ним доступ за пределами класса' StringReader'. – Glorfindel

+0

BugFinder, это задание, которое мне было дано, Я не могу изменить StringReader, чтобы сделать их общедоступными. –

+1

@SimonPrice, тогда ваша задача почти невозможна. Второй самый простой способ - разобрать класс StringReader, сделать эти два поля общедоступными и скомпилировать их и использовать вместо исходной dll. Если это внутренний код, для этого нет никаких последствий, кроме, возможно, разработчика butthurt. –

ответ

3

Вам нужно будет использовать отражение для доступа к частному полю. Вы можете получить доступ ко всем полям типа, используя метод GetField(s). Вы можете получить доступ к их значению с помощью GetValue function

public string GetLongText(StringReader reader) 
{ 
    // Get a reference to the private field 
    var field = reader.GetType().GetField("LongText", BindingFlags.NonPublic | 
         BindingFlags.Instance) 

    // Get the value of the field for the instance reader 
    return (string)field.GetValue(reader);     
} 
+3

Хотя это правильно, я не уверен, действительно ли у ОП есть хорошее понимание его собственного вопроса. Такие утверждения, как 'Text = LongText', похоже, подтверждают это утверждение. Для меня это похоже на XY-проблему. – Stefan

+1

+1 Я согласен, что приведенный код кода сомнительный. Но задача: получить значение частного поля из класса, который по разным причинам не может быть изменен, кажется достаточно простым. Хотя есть определенные предостережения. Таким образом, вам никогда не придется полагаться на что-либо другое, кроме публичного интерфейса метода (в случае обновления класса). Однако на практике иногда вам приходится это делать. Просто хотел добавить ответ, чтобы показать, что ответ не простой «нет его невозможным». –

+0

Есть и другие соображения, которые следует учитывать. Это довольно плохая практика, и это кажется странным способом. Но дальше читать по нему следует рекомендовать, как этот источник: https://msdn.microsoft.com/en-us/library/stfy7tfc.aspx – Draken

0

Без изменения класса невозможно использовать лучшие методы ООП. Они настроены как конфиденциальные, чтобы они могли быть доступны только внутри класса. Вам нужно поговорить с первоначальным разработчиком класса и спросить, почему они не могут сделать публичный поглотитель для частного поля, которое будет выглядеть следующим образом:

public string getText(){ 
    return this.Text; 
} 

Это будет означать строку не может быть изменен, но вы может по крайней мере прочитать его.

+1

Определенно не невозможно, см. Мой ответ. –

2

поля, объявленного в private недоступен вне класса, который определил их. Вы не можете прочитать их значение без любого

  1. Изменение их видимость
  2. Добавление акцесора/свойство с общественной видимости
  3. Использование отражения (это не рекомендуется, есть почти всегда лучший путь)

Что такое прецедент? Чего вы пытаетесь достичь? Если вы определите свою проблему чуть более, возможно, мы сможем дать лучшее решение.

Смежные вопросы