Я в основном обошел этот метод - довольно излишне, но работает.
Я создал новую реализацию IGetter
, которая используется для многоязычных свойств, которую я назвал MultilingualGetter
. Это в основном то же самое, что и BasicGetter
- я не мог расширить его, так как по какой-то причине это sealed
, поэтому я скопировал код
Что делает IGetter
: Когда к нему вызывается метод Get()
, ему присваивается объект target
. Это экземпляр класса, который содержит свойство. Я проверяю, что он реализует интерфейс для многоязычных объектов, которые я создал, IMultilingualContentInfo
. Затем он извлекает текущую культуру из IMultilingualContentInfo
и добавляет ее в начало фактического текста, например, [en] Hello World!.
Этот текст затем передается в созданный мной специальный анализатор, который также анализирует культуру и может определить, что это такое. Затем он использует SnowballFilter
для выделения текста на основе языка.
Ниже приведен код для Get()
метода пользовательской реализации IGetter
- IMultilingualContentInfo
/// <summary>
/// Gets the value of the Property from the object.
/// </summary>
/// <param name="target">The object to get the Property value from.</param>
/// <returns>
/// The value of the Property for the target.
/// </returns>
public object Get(object target)
{
if (target is IMultilingualContentInfo)
{
try
{
IMultilingualContentInfo multiLingualTarget = (IMultilingualContentInfo)target;
string s = (string)property.GetValue(target, new object[0]);
if (!string.IsNullOrWhiteSpace(s))
{
MultilingualLuceneTextContent mlText = new MultilingualLuceneTextContent();
mlText.Culture = multiLingualTarget.CultureInfo.GetCultureCode();
s = mlText.GetTextIncCulture();
}
return s;
}
catch (Exception e)
{
throw new PropertyAccessException(e, "Exception occurred", false, clazz, propertyName);
}
}
else
{
throw new InvalidOperationException("Multilingual Getter is only available on IMultilingualContentInfo objects");
}
}