Steve Naidamast Ответов: 2

Почему продавцы делают свои языки до смешного сложными для простых вещей?


Привет...

Я уже давно работаю с этим .NET development environments с тех пор, как она была коммерчески выпущена в 2001 году.

Я свободно владею обоими языками VB.NET и C#, хотя мой любимый язык всегда был таким VB.NET (спиши это на мои долгие годы работы разработчиком DBase).

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

Недавно я разрабатывал сложное расширение для нового коммерческого приложения, которое я разрабатывал. Это платное расширение предоставит приложению ряд функций безопасности, включая обработку пароля приложения.

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

Ладно, пока все хорошо. Форма ввода пароля содержит свойство, к которому будет обращаться отражение, которое будет содержать введенный пароль. Таким образом, родительское\хост-приложение может получить доступ к данным более подходящим способом, а не просто быть общедоступной строкой.

Так как же мы должны получить доступ к таким данным?

>>>
' retrieve value of window's "ENTERED_PASSWORD" property
loPropertyInfo = loWindow.GetType().GetProperty("ENTERED_PASSWORD")
lsEnteredPassword = DirectCast(loPropertyInfo.GetValue(loWindow, Nothing), String)
<<<

Это решение заняло у меня почти 3 часа, чтобы найти; по крайней мере, для того, что я нашел на самом деле работает.

Вопрос в том, почему нужно снова выполнять вызов GetValue класса PropertyInfo, который затем должен снова ссылаться на вызывающий метод обратно к исходному источнику, где определено свойство (в данном случае "ENTERED_PASSWORD" в форме ввода пароля, которая определяется как "loWindow")?

Из всех глупостей, которые придумала Microsoft, эта должна быть самой глупой.

Можно было бы подумать, что как только вы получите объект PropertyInfo, вы можете просто получить доступ к именованному значению свойства из него. И хотя вы можете перечислить информацию об именованном свойстве, получение значения - это совершенно другое вращение.

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

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

Что еще разработчик хотел бы больше всего от объекта PropertyInfo, чем значение свойства?

Спасибо...

Что я уже пробовал:

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

Wendelius

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

2 Ответов

Рейтинг:
2

Wendelius

Чтобы добавить к решению 1: информацию, которую вы получаете с помощью отражения, например от GetProperties, GetMethods, и т.д. связаны с определением класса, а не с экземпляром этого класса.

Поэтому, когда вы хотите вызвать метод или получить значение из свойства, вам нужно указать экземпляр объекта, который будет вызван. Как уже отмечалось, это чрезвычайно полезно, когда вам нужно получить значения из нескольких экземпляров одного и того же класса. Получение информации с помощью отражения происходит медленно, поэтому вы хотите сделать это только один раз, особенно если у вас есть сотни или тысячи объектов для получения данных.

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

Например, если у вас есть базовый класс Vehicle и мало производных классов, таких как Car, Train, Aeroplane Базовый класс может реализовать свойство IsFree Используя отражение, вы можете получить информацию о свойстве для этого свойства, запросив его из Vehicle класс. Однако при получении фактического значения класс, который вы используете, может быть любым из производных классов.


Рейтинг:
1

Gerry Schmitz

Ваше "Get property", по сути, создает "универсальный" метод доступа к свойствам, который можно использовать с любым объектом, содержащим "это" свойство:--

Вот почему вы предоставляете объект (опять же) в GetValue (или SetValue), потому что это не обязательно должен быть тот же класс, который вы использовали для создания объекта "info" в первую очередь.

Используемый в цикле, вы можете клонировать классы с теми же интерфейсами; получить свойство один раз, использовать его, чтобы получить (значение) от одного, а затем установить другой.