using System;
using System.ComponentModel;
using System.Globalization;
using System.Reflection;
using System.Xaml;
namespace Example
{
public class MyConverter : TypeConverter
{
public override object ConvertFrom( ITypeDescriptorContext context , CultureInfo culture , object value )
{
Type type1 = ( (dynamic) value ).GetType();
Type type2 = typeof( Foo<> ).MakeGenericType( type1 );
object instance = Activator.CreateInstance( type2 );
PropertyInfo prp = type2.GetProperty( nameof( Foo<byte>.Value ) );
prp.SetValue( instance , Convert.ChangeType( value , type1 ) );
return instance;
}
}
public class Foo<T>
{
public T Value { get; set; }
}
public class Bar
{
public int SomeNumber { get; set; }
}
public class MyClass
{
[TypeConverter( typeof( MyConverter ) )]
public Foo<Bar> MyProperty { get; set; }
public void ConvertImplicit()
{
string xml = "<MyClass xmlns=\"http://Example\"> <MyClass.MyProperty> <Bar SomeNumber=\"5\" /> </MyClass.MyProperty> </MyClass>";
MyClass myClass = XamlServices.Parse( xml ) as MyClass;
}
public void ConvertExplicit()
{
MyConverter myConverter = new MyConverter();
Bar bar = new Bar() { SomeNumber = 5 };
Foo<Bar> target = myConverter.ConvertFrom( null , null , bar ) as Foo<Bar>;
}
}
}
显示的TypeConverter在显式转换时按预期工作,如ConvertExplicit中所示。当隐式完成转换时,如ConvertImplicit中所示,将引发异常,表明无法设置MyProperty。
因为没有像ConvertExplicit中那样完成最终强制转换,所以引发异常。
使用TypeConverter进行隐式转换时(例如,使用XamlServices时),无法执行最终转换。
如何修改我的TypeConverter,使其像ConvertExplicit一样工作(转换后没有最终转换)?
顺便说一下:要运行ConvertImplicit,您需要将此代码添加到AssemblyInfo.cs [assembly:XML文件定义("http://示例,""示例")]
1条答案
按热度按时间gwbalxhn1#
根据documentation,XAML将使用类型转换器仅从字符串进行转换,而不从其他类型(如示例中的
Bar
)进行转换:对于XAML来说,只有处理字符串输入的代码路径才是重要的。