powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Как определить, что у атрибута есть локализованные свойства?
1 сообщений из 1, страница 1 из 1
Как определить, что у атрибута есть локализованные свойства?
    #38287120
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Проблема такая. Хочу у типов считывать атрибуты и доставать значения свойств этих атрибутов. Но штука в том, что если эти свойства могут хранить локализованные данные, то достаются эти данные не так, как из нелокализованных свойств. Например, у атрибута DisplayAttribute может быть локализовано свойство Name. Чтобы достать значение локализованного свойства, нужно использовать метод GetName. Тогда значение в Name будет использовано как ключ для словаря ресурсов, в котором лежат локализованные данные. А если использовать метод GetValue, то получишь значение ключа - вообще, того, что записано в этом Name.

Так вот. Пусть для примера есть тип со свойством, к которому приписан атрибут:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
public class MyModel
{
    [Display(
        ResourceType = typeof(Resource1),
        Name = "MyPropertyName",
        Description = "MyPropertyDescription",
        Order = 4)]
    public double MyProperty { get; set; }
}



На входе есть тип (MyModel). И есть два алгоритма доставания данных из свойств атрибутов. Но первая часть лагоритма (C) одинакова:

Код: c#
1.
2.
3.
4.
5.
var modelPropertyInfo = typeof(MyModel).GetProperty("MyProperty");
var attribute = modelPropertyInfo
    .GetCustomAttributes(true)
    .Cast<Attribute>()
    .FirstOrDefault(memberInfo => memberInfo.GetType() == typeof(DisplayAttribute));




Далее различия. Для атрибутов с локализацией данные достаются так:

Код: c#
1.
2.
3.
4.
5.
6.
var result = attribute.GetType().InvokeMember(
    "GetName",
    BindingFlags.InvokeMethod | BindingFlags.Instance | BindingFlags.Public,
    null,
    attribute,
    new object[0]);



А без локализации - так:

Код: c#
1.
2.
var attributeProperty = attribute.GetType().GetProperty("Order");
var result2 = attributeProperty.GetValue(attribute, null);



Штука в том, что я хочу сделать единый алгоритм доставания таких данных, который будет разветвляться в зависимости от того, есть у атрибута локализованные свойства или нет. Это сделать реально или нет?

Сложность ещё в том, что для доставания нелокализованных свойств ЛЮБЫХ атрибутов подходит второй вариант. А вот первый вариант подходит мало того, что только для локализованных свойств, так и ещё у атрибута должен быть метод с именем "GetName". Т. е. по идее, либо надо каждое название метода писать заново, либо передавать делегат - всё через параметр функции, достающей значения атрибутов, как я понимаю. Т. е. в любом случае в цикле уже этого не сделаешь.

Что вы можете посоветовать?
...
Рейтинг: 0 / 0
1 сообщений из 1, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Как определить, что у атрибута есть локализованные свойства?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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