Я создал окончательный конвертер для всех функций в System.String, необходимо некоторое улучшение хотелось бы услышать от вас, надеюсь обновить его в будущем, пожалуйста, примите:
VB:
<ValueConversion(GetType(String), GetType(Object))> _
Class StringFunctions : Implements IValueConverter
Public Function Convert(ByVal value As Object, ByVal targetType As System.Type, ByVal parameter As Object, ByVal culture As System.Globalization.CultureInfo) As Object Implements System.Windows.Data.IValueConverter.Convert
If parameter Is Nothing OrElse Not TypeOf parameter Is String OrElse String.IsNullOrEmpty(parameter) Then Return Nothing
Dim parameters As New List(Of String)(parameter.ToString.Split(":"c))
parameter = parameters(0)
parameters.RemoveAt(0)
If String.IsNullOrEmpty(parameter) Then Return value
Dim method = (From m In GetType(String).GetMethods _
Where m.Name = parameter _
AndAlso m.GetParameters.Count = parameters.Count).FirstOrDefault
If method Is Nothing Then Return value
Return method.Invoke(value, parameters.ToArray)
End Function
Public Function ConvertBack(ByVal value As Object, ByVal targetType As System.Type, ByVal parameter As Object, ByVal culture As System.Globalization.CultureInfo) As Object Implements System.Windows.Data.IValueConverter.ConvertBack
Return value.ToString()
End Function
End Class
C#: -конвертированный инструментом, не полагайтесь!
[ValueConversion(typeof(string), typeof(object))]
public class StringConverter : IValueConverter
{
#region IValueConverter Members
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if (value == null) return null;
value = value.ToString();
if (String.IsNullOrEmpty(value as string)) return "";
if (parameter == null || !parameter is string || String.IsNullOrEmpty((string)parameter)) return value;
List<string> parameters = new List<string>(((string)parameter).Split(':'));
parameter = parameters[0];
parameters.RemoveAt(0);
var method = (from m in typeof(String).GetMethods()
where m.Name== parameter
&& m.GetParameters().Count()==parameters.Count
select m).FirstOrDefault();
if (method == null) return value;
return method.Invoke(value, parameters.ToArray());
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
return value;
}
#endregion
}
Xaml:
<TextBox Text="{Binding Path=String, Converter={StaticResource StringConverter}, ConverterParameter=Trim:Argument:AnotherArgument}" />
Тогда, в связывании, когда и использовать конвертер и есть возможность передать параметр в преобразователе (Binding.ConverterParameter) передают все ваши параметры, разделенные: (двоеточие - вы можете изменить его в параметре ограничителя String.Split), а первым параметром является имя функции, функция будет подсчитывать дополнительные параметры и попытаться передать их.
Я все еще не работал над адресацией параметров, это неглубокая функция.
Хотели бы видеть ваши улучшения и примечания.
спасибо. Shimmy
Я только что понял, что мое сообщение находится на C#. Вы называете Trim без круглых скобок, вы используете VB? Если это так, добавьте тег для VB, и я могу обновить свой образец. – bendewey
В будущем, пожалуйста, убедитесь, что спецификации четко указаны в вопросе, а не только в заголовке. – bendewey
Я буду, спасибо. Я работаю с VB и C#, но этот пост был действительно VB, поскольку только VB поддерживает вызовы методов без скобок. – Shimmy