Вы можете использовать этот контейнер ScalarCollection
, который ограничивает массив и предоставляет некоторые параметры манипуляции ( Gist ):
Использование:
public class Person
{
public int Id { get; set; }
//will be stored in database as single string.
public SaclarStringCollection Phones { get; set; } = new ScalarStringCollection();
}
Код:
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Linq;
namespace System.Collections.Specialized
{
#if NET462
[ComplexType]
#endif
public abstract class ScalarCollectionBase :
#if NET462
Collection,
#else
ObservableCollection
#endif
{
public virtual string Separator { get; } = "\n";
public virtual string ReplacementChar { get; } = " ";
public ScalarCollectionBase(params T[] values)
{
if (values != null)
foreach (var item in Items)
Items.Add(item);
}
#if NET462
[Browsable(false)]
#endif
[EditorBrowsable(EditorBrowsableState.Never)]
[Obsolete("Not to be used directly by user, use Items property instead.")]
public string Data
{
get
{
var data = Items.Select(item => Serialize(item)
.Replace(Separator, ReplacementChar.ToString()));
return string.Join(Separator, data.Where(s => s?.Length > 0));
}
set
{
Items.Clear();
if (string.IsNullOrWhiteSpace(value))
return;
foreach (var item in value
.Split(new[] { Separator },
StringSplitOptions.RemoveEmptyEntries).Select(item => Deserialize(item)))
Items.Add(item);
}
}
public void AddRange(params T[] items)
{
if (items != null)
foreach (var item in items)
Add(item);
}
protected abstract string Serialize(T item);
protected abstract T Deserialize(string item);
}
public class ScalarStringCollection : ScalarCollectionBase
{
protected override string Deserialize(string item) => item;
protected override string Serialize(string item) => item;
}
public class ScalarCollection : ScalarCollectionBase
where T : IConvertible
{
protected override T Deserialize(string item) =>
(T)Convert.ChangeType(item, typeof(T));
protected override string Serialize(T item) => Convert.ToString(item);
}
}
Попытайтесь смотреть пользовательский элемент управления SecurePasswordTextBox . Вы пытаетесь сделать что-то подобное "Выполненный Как" команда типа, где Вы пытаетесь выполнить процесс как различный пользователь, чем тот в настоящее время входил в систему? В противном случае необходимо быть в состоянии только к обработке вызовов. Запустите и позвольте ему взять текущие пользовательские учетные данные.
кроме того, смотрите на следующие ресурсы также:
наилучший вариант состоял бы в том, чтобы, вероятно, использовать некоторый interop p/inovke код для вызова CredUIPromptForCredentials, чтобы отобразить стандартное диалоговое окно Windows и затем использовать ту информацию для любой обработки вызовов. Запустите, или, более вероятно, вызовите функцию CreateProcessAsUser.
Причина SecureString хочет принять один символ за один раз, состоит в том, что иначе Вы имели бы всю строку перед этим и заставили бы строку быть в памяти. Таким образом, с помощью SecureString в этом виде сценария поражений цель.