Вы можете сделать это, применив конвертер типа , это упомянуто в документации , но, к сожалению, без примера. Я реализовал необходимые биты, чтобы ваш пример работал.
Я добавил некоторые общие ограничения в классе KeyConverter, которые, кажется, соответствуют вашим потребностям, хотя они и не нужны.
public class KeyConverter<T> : TypeConverter
where T : struct, IEquatable<T>
{
public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
{
if (sourceType == typeof(string))
{
return true;
}
return base.CanConvertFrom(context, sourceType);
}
public override object ConvertFrom(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value)
{
var stringValue = value as string;
if (!string.IsNullOrWhiteSpace(stringValue))
{
if(int.TryParse(stringValue, out int parsed))
{
return Activator.CreateInstance(typeof(T), new object[] { parsed });
}
}
return base.ConvertFrom(context, culture, value);
}
}
Затем украсьте ваши ключевые классы атрибутом TypeConverter
.
[TypeConverter(typeof(KeyConverter<DogKey>))]
public struct DogKey : IEquatable<DogKey>
{
public DogKey(int id)
{
Id = id;
}
public int Id { get; }
#region IEquatable implementation
#endregion IEquatable implementation
}
[TypeConverter(typeof(KeyConverter<CatKey>))]
public struct CatKey : IEquatable<CatKey>
{
public CatKey(int id)
{
Id = id;
}
public int Id { get; }
#region IEquatable implementation
#endregion IEquatable implementation
}