C#で単純な型コンバーターを実装するのに苦労しています。私はこのガイドに従いました https://msdn.Microsoft.com/en-us/library/ayybcxe5.aspx
これが私のクラスです:
_public class TestClass: TypeConverter
{
public string Property1{ get; set; }
public int Property2 { get; set; }
public TestClass(string p1, int p2)
{
Property1= p1;
Property2 = p2;
}
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,
CultureInfo culture, object value)
{
if (value is string) {
return new TestClass ("", Int32.Parse(value.ToString()));
}
return base.ConvertFrom(context, culture, value);
}
public override object ConvertTo(ITypeDescriptorContext context,
CultureInfo culture, object value, Type destinationType)
{
if (destinationType == typeof(string)) {
return "___"
}
return base.ConvertTo(context, culture, value, destinationType);
}
}
_
私は次のことをしますTestClass ("", Int32.Parse(value.ToString()));
今のところ私は"1231" -> new TestClass("", 1231)
のような場合にのみ興味があります
そして、ここに私に例外を与えるコードがあります。
_TypeConverter converter=TypeDescriptor.GetConverter( typeof(TestClass));
Object lalala = converter.ConvertFromString("234");
_
このコードはNotSupportedException
をスローしますが、理由がわかりません
このコンバーターは、TypeConverter
属性を持つクラスにアタッチする必要があります。TypeDescriptor.GetConverter
クラスの添付コンバーターを取得します。
クラスをよりよく分割します。
[TypeConverter(typeof (TestClassConverter))]
public class TestClass
{
public string Property1 { get; set; }
public int Property2 { get; set; }
public TestClass(string p1, int p2)
{
Property1 = p1;
Property2 = p2;
}
}
[TypeConverter(typeof (TestClassConverter))]
public class TestClassConverter : TypeConverter
{
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,
CultureInfo culture, object value)
{
if (value is string)
{
return new TestClass("", Int32.Parse(value.ToString()));
}
return base.ConvertFrom(context, culture, value);
}
public override object ConvertTo(ITypeDescriptorContext context,
CultureInfo culture, object value, Type destinationType)
{
if (destinationType == typeof(string)) { return "___"; }
return base.ConvertTo(context, culture, value, destinationType);
}
}
提供されたコードは少し混乱しており、いくつかの重要なものが欠けています。次に、カスタムクラスCrazyClass
をstring
との間で変換する実装を示します。
CrazyClassTypeConverter
public class CrazyClassTypeConverter : TypeConverter
{
public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
{
return sourceType == typeof(string) || base.CanConvertFrom(context, sourceType);
}
public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
{
var casted = value as string;
return casted != null
? new CrazyClass(casted.ToCharArray())
: base.ConvertFrom(context, culture, value);
}
public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType)
{
var casted = value as CrazyClass;
return destinationType == typeof (string) && casted != null
? String.Join("", casted.Charray)
: base.ConvertTo(context, culture, value, destinationType);
}
}
CrazyClass
(クラスはTypeConverterAttribute
で装飾されていることに注意してください)
[TypeConverter(typeof(CrazyClassTypeConverter))]
public class CrazyClass
{
public char[] Charray { get; }
public CrazyClass(char[] charray)
{
Charray = charray;
}
}
使用方法
var crazyClass = new CrazyClass(new [] {'T', 'e', 's', 't'});
var converter = TypeDescriptor.GetConverter(typeof(CrazyClass));
//this should provide you the string "Test"
var crazyClassToString = converter.ConvertToString(crazyClass);
//provides you an instance of CrazyClass with property Charray set to {'W', 'h', 'a', 't' }
var stringToCrazyClass = converter.ConvertFrom("What");