Я пытаюсь обрабатывать несколько языков в приложении ASP.NET Webforms (.NET 4.5, C#).Автоматическая обработка многоязычных свойств в .NET-классе
В принципе, некоторые из моих сущностей в моей базе данных SQL Server 2012 имеют такие свойства, как Name
или Description
, которые существуют на трех языках - немецком, французском, итальянском.
Данные хранятся в колонках Name_De
(немецкий), Name_Fr
(французский) и Name_It
(итальянский).
Когда я создаю свои объекты .NET из базы данных, конечно, я также получаю эти три свойства в классе сущности. Но для отображения на экране, например, в сетке было бы неплохо, если бы я как-то «волшебным образом» всегда показывал «правильный» язык. Это должно быть основано на Thread.Current.CurrentUICulture.TwoLetterISOLanguageName
(который возвращает de
, fr
или it
, в зависимости от языковых настроек браузера).
Так что я надеялся как-то создать, например. атрибут .NET, который позволил бы мне сделать что-то вроде этого:
Base "Модуль" сущностей - сгенерированный из существующей базы данных SQL Server:
public partial class Module
{
public string ModuleCode { get; set; }
public string Name_De { get; set; }
public string Name_Fr { get; set; }
public string Name_It { get; set; }
... // other properties
}
Частичное расширение в отдельном файле
public partial class Module
{
[Multilingual]
public string Name { get; set; }
}
Основная идея: я могу получить доступ к свойству Module.Name
, и в зависимости от текущей настройки CurrentUICulture
либо значение Name_De
, Name_Fr
или Name_It
было бы выбрано, wh ru Я получаю доступ к получателю свойства Name
.
Может ли что-то подобное сделать на C#? Я просмотрел множество пользовательских реализаций атрибутов, но ничто никогда не делало что-то вроде этого ...
Я уверен, что смогу это сделать, но сделать это для нескольких классов, и до трех групп свойств для каждого класса кажется слишком утомительным. И да - я думал об использовании рефлексии в этом атрибуте - зная, что он привязан к свойству «Имя», он может тогда искать свойства «Name_De» и т. Д. И возвращать «правильное» значение. Но я не нашел подходящего базового класса для атрибута «Атрибут», который каким-то образом позволил бы мне узнать, когда вызывается получатель этого свойства .... –
На самом деле это два отдельных файла, но оба являются «общедоступными» partial class Module ", поэтому компилятор C# объединит их вместе в единый объект в конце –
Да, это утомительно. Пользовательские атрибуты - это метаданные поверх вашего свойства, но вы не сможете выполнять «Object.Name» и вызываете свой код пользовательского атрибута. Я попытаюсь подумать о другом способе сделать это без automapper –