Если вы хотите IPA-перевод определенного написания, я предлагаю использовать функцию iOS, расположенную в Settings > General > Accessibility > Speech > Pronunciations
(iOS 12) .
Выбрав желаемый результат, вы можете использовать его в своем коде для озвучивания синтезатором речи.
Реализуйте преобразователь типов, вот один, предупреждение: быстро и грязно, не для производственного использования и т. Д .:
public class IntArrayConverter : System.ComponentModel.TypeConverter
{
public override bool CanConvertFrom(System.ComponentModel.ITypeDescriptorContext context, Type sourceType)
{
return sourceType == typeof(string);
}
public override object ConvertFrom(System.ComponentModel.ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value)
{
string val = value as string;
string[] vals = val.Split(',');
System.Collections.Generic.List<int> ints = new System.Collections.Generic.List<int>();
foreach (string s in vals)
ints.Add(Convert.ToInt32(s));
return ints.ToArray();
}
}
и пометьте свойство вашего элемента управления:
private int[] ints;
[TypeConverter(typeof(IntsConverter))]
public int[] Ints
{
get { return this.ints; }
set { this.ints = value; }
}
@mathieu, большое спасибо за твой код. Я немного изменил его, чтобы скомпилировать:
public class IntArrayConverter : System.ComponentModel.TypeConverter
{
public override bool CanConvertFrom(System.ComponentModel.ITypeDescriptorContext context, Type sourceType)
{
return sourceType == typeof(string);
}
public override object ConvertFrom(System.ComponentModel.ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value)
{
string val = value as string;
string[] vals = val.Split(',');
System.Collections.Generic.List<int> ints = new System.Collections.Generic.List<int>();
foreach (string s in vals)
ints.Add(Convert.ToInt32(s));
return ints.ToArray();
}
}
Кажется мне что logical— и больше extensible— подход должен взять страницу от asp:
средства управления списком:
<uc1:mycontrol runat="server">
<uc1:myintparam>1</uc1:myintparam>
<uc1:myintparam>2</uc1:myintparam>
<uc1:myintparam>3</uc1:myintparam>
</uc1:mycontrol>
Вы пытались заглянуть в преобразователи типов? Эта страница выглядит достойно внимания: http://www.codeguru.com/columns/VB/article.php/c6529/
Кроме того, Spring.Net, похоже, имеет StringArrayConverter ( http://www.springframework.net/doc-latest/reference/html/objects-misc.html - раздел 6.4), который, если вы можете передать его в ASP.net, украсив свойство с помощью Атрибут TypeConverter, может работать ..
Чтобы добавить дочерние элементы, которые составляют ваш список, вам нужно настроить ваш элемент управления определенным образом:
[ParseChildren(true, "Actions")]
[PersistChildren(false)]
[ToolboxData("<{0}:PageActionManager runat=\"server\" ></PageActionManager>")]
[NonVisualControl]
public class PageActionManager : Control
{
Вышеуказанные действия - это имя свойства, в котором будут находиться дочерние элементы. Я использую ArrayList, так как я ничего с ним не тестировал. :
private ArrayList _actions = new ArrayList();
public ArrayList Actions
{
get
{
return _actions;
}
}
, когда ваш contorl инициализируется, он будет иметь значения дочерних элементов. Те, что вы можете сделать мини-класс, который просто держит целые.
Действительно сделайте то, о чем говорил Bill со списком, просто необходимо создать свойство List на пользовательском элементе управления. Тогда можно реализовать его, как Bill описал.
Вы могли добавить к событиям страницы в aspx что-то вроде этого:
<script runat="server">
protected void Page_Load(object sender, EventArgs e)
{
YourUserControlID.myintarray = new Int32[] { 1, 2, 3 };
}
</script>
Можно реализовать класс конвертера типов, который преобразовывает между международными типами данных массива и типами данных String. Тогда украсьте свое международное свойство массива TypeConverterAttribute, определив класс, который Вы реализовали. Visual Studio будет тогда использовать Ваш конвертер типов для преобразований типов на Вашем свойстве.
Вы также можете сделать что-то вроде этого:
namespace InternalArray
{
/// <summary>
/// Item for setting value specifically
/// </summary>
public class ArrayItem
{
public int Value { get; set; }
}
public class CustomUserControl : UserControl
{
private List<int> Ints {get {return this.ItemsToList();}
/// <summary>
/// set our values explicitly
/// </summary>
[PersistenceMode(PersistenceMode.InnerProperty), TemplateContainer(typeof(List<ArrayItem>))]
public List<ArrayItem> Values { get; set; }
/// <summary>
/// Converts our ArrayItem into a List<int>
/// </summary>
/// <returns></returns>
private List<int> ItemsToList()
{
return (from q in this.Values
select q.Value).ToList<int>();
}
}
}
, что приведет к:
<xx:CustomUserControl runat="server">
<Values>
<xx:ArrayItem Value="1" />
</Values>
</xx:CustomUserControl>