Гость
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Получить имя свойства / 25 сообщений из 28, страница 1 из 2
08.07.2014, 22:31
    #38691178
Thor234
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить имя свойства
Здравствуйте. Ребят запутался, помогите пожалуйста разобраться.

Есть интерфейс, назовем его - ITest
В этом интерфейсе объявлено свойство типа MyType, назовем его - MyProp
Есть несколько классов явно реализующих этот интерфейс
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
Class1 : ITest
{
MyType ITest.MyProp { get { return SomePropertyInClass; }
}
Class2 : ITest
{
MyType ITest.MyProp { get { return OtherProperty; }
}


Забегу наперед и уточню, что классы имеют другие свойства типа MyType.
Есть некий метод сторонней библиотеки для проверки прав доступа. В параметры метода передается имя свойства для проверки.
Само проверяемое свойство зависит от конкретного класса, но у меня на руках есть лишь экземпляр ITest со ссылкой (ITest.MyProp) на это свойство и я не знаю заранее его имени, оно различно от класса к классу.
Так вот как мне достать имя (string) свойства которое возвращено при реализации интерфейса? Т.е. при текущей реализации для Class1 - "SomePropertyInClass" и для Class2 - "OtherProperty"
...
Рейтинг: 0 / 0
08.07.2014, 22:44
    #38691184
Где-то в степи
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить имя свойства
Thor234,
авторна это свойство и я не знаю заранее его имени, оно различно от класса к классу
имя у него одно, для всех классов, это же интерфейс
...
Рейтинг: 0 / 0
08.07.2014, 22:48
    #38691187
Thor234
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить имя свойства
Где-то в степиThor234,
авторна это свойство и я не знаю заранее его имени, оно различно от класса к классу
имя у него одно, для всех классов, это же интерфейс
Т.е. никак не получить имя свойства на которое ссылается ITest.MyProp?
...
Рейтинг: 0 / 0
08.07.2014, 22:57
    #38691192
Где-то в степи
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить имя свойства
Thor234,
"MyProp"
...
Рейтинг: 0 / 0
08.07.2014, 22:59
    #38691194
Где-то в степи
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить имя свойства
Thor234,
чето щас доперло propertyName путаем с Value,( какой травы обкурились?) курите рефлексию
...
Рейтинг: 0 / 0
08.07.2014, 23:07
    #38691199
Thor234
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить имя свойства
Где-то в степиThor234,
чето щас доперло propertyName путаем с Value,( какой травы обкурились?) курите рефлексию
Вот в том, то и дело курю, курю рефлексию а раскурить не могу никак.
Вот мне как раз нужно получить propertyName, я вроде не путаю propertyName с Value
...
Рейтинг: 0 / 0
08.07.2014, 23:09
    #38691200
Thor234
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить имя свойства
Мне думалось, раз реализация свойства явная , то есть способ достать.
Понятное дело, что если неявно реализовать интерфейс, то свойство и будет иметь propertyName - "MyProp"
...
Рейтинг: 0 / 0
08.07.2014, 23:20
    #38691207
Где-то в степи
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить имя свойства
Thor234,
причем тут реализация, явно не явно?
var name= typeof (ITest).GetProperties().First().Name;
...
Рейтинг: 0 / 0
08.07.2014, 23:36
    #38691216
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить имя свойства
Thor234Здравствуйте. Ребят запутался, помогите пожалуйста разобраться.

Есть интерфейс, назовем его - ITest
В этом интерфейсе объявлено свойство типа MyType, назовем его - MyProp
Есть несколько классов явно реализующих этот интерфейс
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
Class1 : ITest
{
MyType ITest.MyProp { get { return SomePropertyInClass; }
}
Class2 : ITest
{
MyType ITest.MyProp { get { return OtherProperty; }
}


Забегу наперед и уточню, что классы имеют другие свойства типа MyType.
Есть некий метод сторонней библиотеки для проверки прав доступа. В параметры метода передается имя свойства для проверки.
Само проверяемое свойство зависит от конкретного класса, но у меня на руках есть лишь экземпляр ITest со ссылкой (ITest.MyProp) на это свойство и я не знаю заранее его имени, оно различно от класса к классу.
Так вот как мне достать имя (string) свойства которое возвращено при реализации интерфейса? Т.е. при текущей реализации для Class1 - "SomePropertyInClass" и для Class2 - "OtherProperty"А может простым языком объясните, что конкретно нужно проверить?

Иначе используйте отражение (Refelection). Производительность только не забудьте замерить :)
...
Рейтинг: 0 / 0
08.07.2014, 23:41
    #38691222
Thor234
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить имя свойства
Где-то в степиThor234,
причем тут реализация, явно не явно?
var name= typeof (ITest).GetProperties().First().Name;
Все, понял свою ошибку. Действительно получает имя как объявлено в интерфейсе.
Буду искать другой путь.
Спасибо добрый человек
...
Рейтинг: 0 / 0
08.07.2014, 23:53
    #38691236
Thor234
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить имя свойства
skyANAThor234Здравствуйте. Ребят запутался, помогите пожалуйста разобраться.

Есть интерфейс, назовем его - ITest
В этом интерфейсе объявлено свойство типа MyType, назовем его - MyProp
Есть несколько классов явно реализующих этот интерфейс
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
Class1 : ITest
{
MyType ITest.MyProp { get { return SomePropertyInClass; }
}
Class2 : ITest
{
MyType ITest.MyProp { get { return OtherProperty; }
}


Забегу наперед и уточню, что классы имеют другие свойства типа MyType.
Есть некий метод сторонней библиотеки для проверки прав доступа. В параметры метода передается имя свойства для проверки.
Само проверяемое свойство зависит от конкретного класса, но у меня на руках есть лишь экземпляр ITest со ссылкой (ITest.MyProp) на это свойство и я не знаю заранее его имени, оно различно от класса к классу.
Так вот как мне достать имя (string) свойства которое возвращено при реализации интерфейса? Т.е. при текущей реализации для Class1 - "SomePropertyInClass" и для Class2 - "OtherProperty"А может простым языком объясните, что конкретно нужно проверить?

Иначе используйте отражение (Refelection). Производительность только не забудьте замерить :)
Как я уже сказал использую стороннюю библиотеку ORM, грубо говоря используется для разграничения прав. Есть в ней метод проверяющий "имеет ли" конкретный пользователь права на запись конкретного поля "персистентного" класса (это же ORM).
Но некий общий функционал использует эти классы как интерфейсы. И нужно проверять права на запись.
В общем мне кажется я еще больше запутал :)
Понял, что имея на руках интерфейсную ссылку получить имя поля класса возвращаемое при реализации интерфейса никак не получится
...
Рейтинг: 0 / 0
09.07.2014, 00:19
    #38691252
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить имя свойства
Расковыряйте ORM рефлектором и посмотрите как там это реализовано.
...
Рейтинг: 0 / 0
09.07.2014, 00:21
    #38691253
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить имя свойства
Но вообще маппинги они двух типов: на отражении (Reflection) и на сгенерированных на основе чего-то (файла xml например) метаданных.
...
Рейтинг: 0 / 0
09.07.2014, 00:27
    #38691258
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить имя свойства
В ORM-то небось строковое имя свойства - это ключ в какой нибудь готовой карте/словарике (Map) метаданных. По нему они быстро достаются и что-то там проверяется, флаг AllowWrite
Вам зачем на него ориентироваться, не понятно.
...
Рейтинг: 0 / 0
09.07.2014, 00:31
    #38691260
Где-то в степи
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить имя свойства
Thor234,
авторПонял, что имея на руках интерфейсную ссылку получить имя поля класса возвращаемое при реализации интерфейса никак не получится
я так и ничего не понял, что вы хотите.
...
Рейтинг: 0 / 0
09.07.2014, 02:13
    #38691294
Где-то в степи
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить имя свойства
Thor234,
чего то подумалось, а как вы будете объяснять пользователю, что привилегий не хватает, алертом или исключением.
так вот что бы имхо не доводить до греха и искушения, сделайте разграничение прав на уровне приложения , а базу как последний
РЕДУТ, а если не персистентный класс на вставку, то че исключение? дак не допускайте на уровне приложения вставки модификации или удаления,
...
Рейтинг: 0 / 0
09.07.2014, 02:15
    #38691295
Где-то в степи
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить имя свойства
а если потом в трехзвенку все это хозяйство надо будет переделать? то ваще прикурим с этими макаронами..
...
Рейтинг: 0 / 0
09.07.2014, 11:13
    #38691604
Thor234
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить имя свойства
skyANAВ ORM-то небось строковое имя свойства - это ключ в какой нибудь готовой карте/словарике (Map) метаданных. По нему они быстро достаются и что-то там проверяется, флаг AllowWrite
Вам зачем на него ориентироваться, не понятно.
Если копать глубже, то по сути дела Вы правы, так и есть - каждое поле класса отмеченное атрибутом это поле в БД, но еще бывают у полей алиасы на поля БД, т.е. имя свойства класса и имя поля в БД могут не совпадать. Тот метод в который мне нужно передать строковое название свойства (memberName) уже дальше сам рефлексией находит поле в классе, смотрит атрибуты маппинга, проверяет права и т.д. и если я ему передам в качестве параметра маппинг на поле в БД, то неизвестно, что может произойти в будущем.

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

Попробую еще раз объяснить, что нужно в результате не вдаваясь в подробности, но иллюстрируя именно мою ситуацию.
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
interface ITest
{
    MyType MyProp {get;}
}

//Этот класс имеет одно свойство MyProp, которое попадает под реализацию интерфейса
Class1 : ITest
{
    MyType MyProp { get; }
}
//Этот класс также реализует свойство MyProp интерфейса ITest, но нас не устраивает по каким либо причинам свойство MyProp и мы явно реализуем поддержку интерфейса передав другое поле того же типа
Class2 : ITest
{
    MyType ITest.MyProp { get { return OtherMyTypeProperty; }
    MyType MyProp { get; }
    MyType OtherMyTypeProperty { get; }
}


Далее имею на руках:
Код: c#
1.
2.
3.
4.
//Это может быть экземпляр как Class1, так и Class2
var currentObject = View.CurrentObject as ITest;
//Экземпляр класса Type текущего класса, т.е. тут я уже имею тип класса, допустим это typeof(Class2)
var currentObjectType = View.GetCurrentObjectType();


Итого имея, то что есть можно ли и как получить memberName (которое равно "OtherMyTypeProperty") свойства MyProp для нашего объекта currentObject as ITest
...
Рейтинг: 0 / 0
09.07.2014, 11:24
    #38691636
Thor234
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить имя свойства
Пробовал так:
currentObjectType.GetProperties().First(prop => prop.GetValue(currentObject) == currentObject.MyType)
Но потом понял, что другие поля типа MyProp экземпляра currentObject могут иметь, то же самое значение и этот подход вернет не правильное PropertyInfo
...
Рейтинг: 0 / 0
09.07.2014, 11:54
    #38691692
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить имя свойства
Thor234, у меня сложилось впечатление, что Вы тупо пытаетесь для решения своей проблемы заюзать функционал ORM.
Типа в нём есть метод, что вроде делает то, что Вам надо, только вот осталось ему наименование нужного поля передать.

Думали, что побырику получите это наименование и вуаля. Но не тут-то было

Может не стоит завязываться на ORM, а реализовать необходимую логику нормальным путём?
...
Рейтинг: 0 / 0
09.07.2014, 12:01
    #38691703
Thor234
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить имя свойства
skyANAThor234, у меня сложилось впечатление, что Вы тупо пытаетесь для решения своей проблемы заюзать функционал ORM.
Типа в нём есть метод, что вроде делает то, что Вам надо, только вот осталось ему наименование нужного поля передать.

Думали, что побырику получите это наименование и вуаля. Но не тут-то было

Может не стоит завязываться на ORM, а реализовать необходимую логику нормальным путём?
К счастью Вы не правы, все приложение построено на базе ORM, но есть мой дополнительный функционал, действия выполняемые пользователем, и дабы не плодить огород из однотипных действий для разных классов и служит интерфейс. А проверка прав нужна лишь для установки видимости грубо говоря кнопки выполняющей это действие. Использую разграничение прав на уровне приложения
...
Рейтинг: 0 / 0
09.07.2014, 12:16
    #38691737
Где-то в степи
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить имя свойства
Thor234,
авторК счастью Вы не правы, все приложение построено на базе ORM, но есть мой дополнительный функционал, действия выполняемые пользователем
это легко проверить, что вы написали, проведите мысленный тест, поменяйте тип орм которая не поддерживает гранты - привилегии, там должно измениться немного кода в модуле получения данных, атрибуты мапа, если ваш модуль так же защищает права - гут
если все рухнуло - это говно..
...
Рейтинг: 0 / 0
09.07.2014, 12:20
    #38691743
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить имя свойства
Где-то в степиThor234К счастью Вы не правы, все приложение построено на базе ORM, но есть мой дополнительный функционал, действия выполняемые пользователем
это легко проверить, что вы написали, проведите мысленный тест, поменяйте тип орм которая не поддерживает гранты - привилегии, там должно измениться немного кода в модуле получения данных, атрибуты мапа, если ваш модуль так же защищает права - гут
если все рухнуло - это говно..
+1
...
Рейтинг: 0 / 0
09.07.2014, 12:46
    #38691786
Thor234
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить имя свойства
Где-то в степиThor234,
авторК счастью Вы не правы, все приложение построено на базе ORM, но есть мой дополнительный функционал, действия выполняемые пользователем
это легко проверить, что вы написали, проведите мысленный тест, поменяйте тип орм которая не поддерживает гранты - привилегии, там должно измениться немного кода в модуле получения данных, атрибуты мапа, если ваш модуль так же защищает права - гут
если все рухнуло - это говно..
Есть такой замечательный фреймворк от DevExpress - eXpressApp
В котором базовый функционал ORM, разграничение прав доступа и многое, многое другое из коробки.
Создавая приложение работаешь в основном с бизнес объектами. И реализуя свой дополнительный функционал - нужно лишь поддержать концепцию фреймворка по разграничению прав. Никаких велосипедов я не строю и не собираюсь
Люди будьте добрее.
...
Рейтинг: 0 / 0
09.07.2014, 12:57
    #38691799
Где-то в степи
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить имя свойства
Thor234,
так зачем же вы для поддержания концепции лезете в коробку ( практикуете Проктологию), если вы пишете защиту
на уровне своего модуля, причем тут девки, вместо них может быть и другая орм, или вообще сервис, или другое soa.
Вы не можете сделать свой модуль изолированным от видов орм? вы не можете получить запросом привилегии для пользователя?
и строить защиту от этого?
...
Рейтинг: 0 / 0
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Получить имя свойства / 25 сообщений из 28, страница 1 из 2
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]