Я могу изменить частное поле только для чтения в C# с помощью отражения?

В общем, это происходит, когда вы предоставляете строковый литерал, когда angular ожидает выражения или функции . «#» В строке вызывает ошибку $parse:lexerr.

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

Неправильно :

<my-directive my-attr="/foo#bar"></my-directive>

Исправлено :

<my-directive my-attr="'/foo#bar'"></my-directive>

В этом примере атрибут my-attr был установить для двусторонней привязки (=) в пользовательском my-directive. Если бы он был установлен в «@», ошибка бы не произошла.

scope: {
  my-attr: "="
}
111
задан Jon Seigel 18 May 2010 в 01:51
поделиться

4 ответа

Вы можете:

typeof(Foo)
   .GetField("bar",BindingFlags.Instance|BindingFlags.NonPublic)
   .SetValue(foo,567);
144
ответ дан 24 November 2019 в 03:01
поделиться

Ответ положительный, но что более важно:

Зачем вам это нужно? Намеренное нарушение инкапсуляции кажется мне ужасно плохой идеей.

Использование отражения для изменения поля, предназначенного только для чтения или постоянного, похоже на объединение Закона непредвиденных последствий с Законом Мерфи .

]
2
ответ дан 24 November 2019 в 03:01
поделиться

Очевидно, стоит попробовать:

using System;
using System.Reflection;

public class Test
{
    private readonly string foo = "Foo";

    public static void Main()
    {
        Test test = new Test();
        FieldInfo field = typeof(Test).GetField
            ("foo", BindingFlags.Instance | BindingFlags.NonPublic);
        field.SetValue(test, "Hello");
        Console.WriteLine(test.foo);
    }        
}

Это отлично работает. (Интересно, что в Java действуют другие правила - вы должны явно сделать доступным поле , и оно в любом случае будет работать только для полей экземпляра.)

52
ответ дан 24 November 2019 в 03:01
поделиться

Похоже, вы спрашиваете, стоит ли в вашей ситуации отдавать предпочтение наследству или составу. Я бы сказал, что вы не создаете новую реализацию List и вас не волнует, как List реализуется, поэтому наследование не подходит для вашей проблемы. Вместо этого предоставляется функция пейджинга. Я бы создал класс, который обобщенно упаковывает (инкапсулирует) логику подкачки с помощью List или какой-либо другой общей коллекции.

-121--3853752-

Ваш код работает с календарем Google по умолчанию для указанного имени пользователя и пароля. (IE использует календарь по умолчанию для username@gmail.com) Это видно, так как URI указывает на «/feed/default/private ». Если вы хотите опубликовать событие в другом календаре, имя пользователя должно быть авторизовано для публикации в этом календаре, и вам нужно отправить в ЭТО календари private uri.

ПРАВКА: По умолчанию этот частный URL-адрес имеет формат « http://www.google.com/calendar/feeds/CALENDAR_ID/private/full »

Для поиска идентификатора календаря используется следующий адрес календаря на странице параметров настройки календаря в Google Calendars. Он будет выглядеть так:

«* * * * * * * * * * * * * * * * * * * * * * * * * * @ group.calendar.google.com»

Окончательный URL-адрес:

EDIT: « http://www.google.com/calendar/feeds/ * * * * * * * * * * * * * * * * * * * * * * @ group.calendar.google.com/private/full»

Это произойдет в вашем Uri postUri = new Uri ();

EDIT:

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

-121--4950656-

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

Я использую класс помощника объекта для гидратации объектов. При этом используется отражение для получения всех свойств новой пустой сущности, а имя свойства/поля сопоставляется со столбцом в результирующем наборе и задается с помощью метода propertyinfo.setvalue ().

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

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

4
ответ дан 24 November 2019 в 03:01
поделиться
Другие вопросы по тегам:

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